TCL语言小试

搞芯片的要是不会tcl真的有点说不过去,虽然严格上我并不算是搞芯片的,但是tcl还是有必要了解一下的,因为FPGA里面还是要用到很多tcl脚本的。下面我们就根据一个具体的例子来看看tcl是怎么读取二进制文件的。

先看需求

现在我们要把一个二进制的文件通过tcl读取并转换成一个列表,二进制文件通常是我们程序生成的一个bin文件,转换成列表之后可以用于更新Memory或者仿真等操作。

程序编写

都说Google是最好的教程,学习tcl也不例外,这里的程序基本都是Google来的,tcl本身的文件IO都是默认支持文本文件的,不像Python等语言打开文件的时候有b的选项,tcl里面需要通过一个fconfigure $fp -translation binary把我们读文件的方式转换成二进制读写的方式,稍显复杂,但是Google一下很容易就能找到,所以也不是什么问题。

这里我们先把最终的程序贴出来,然后一点点分析一下:

proc binary2list {binary_path} {
    set fp [open $binary_path]
    fconfigure $fp -translation binary
    set binary_data [list]
    set data [read $fp 4]
    while { $data != "" } {
        # i for signed iu for unsigned little-end
        # I for big-end, H for big-end hex
        binary scan $data "iu*" d
        lappend binary_data $d
        set data [read $fp 4]
    }
    close $fp
    return $binary_data
}

首先为了通用性,这里定义了一个过程,也就是我们常说的函数,要注意tcl里面比较少用(),过程参数,条件判断等等都是{},这个和很多语言都不一样,一定要注意。函数的参数我们只有一个二进制文件的路径,首先我们还是用常规的方法打开文件,然后通过fconfigure $fp -translation binary将文件读取的方式转换成二进制的方式,往下是定义一个binary_data的列表用于保存结果,然后通过set data [read $fp 4]读取4个字节的数据。

注意tcl读取文件的时候,即使到了末尾也不会出现错误,只是读到的数据是空的而已,所以我们要对读到的数据进行判断,如果是""说明二进制文件已经全部读完。读到二进制数据之后,我们要将二进制数据转化成整型,这一步是通过binary scan实现的,binary scan $data "iu*" d这一步就是将data根据Little-endian转换成无符号整型,并将结果保存到d变量,这里iu*就是转换方式的一个标识符,i代表Little-endian的有符号整型,I代表Big-endian的有符号整型,这个里面还是有些麻烦的,具体可以参考相关文档。最后我们将转换好的结果放到列表并读取新的数据。

以上就是一个简单的tcl读取二进制文件的例子,相比而言稍显复杂,但是结果Google之后并不太难,关键还是在于动手。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论