2 多核映像文件的组成与产生
映像文件就是用户要烧写到外部FLASH上的全部数据文件,它是由二级加载器Loader的代码数据(在文件前部)和应用程序的根表(Boot Table)数据(文件后部)的合成数据文件。单核和多核的二级Loader 都一样,区别就是后部的根表数据。根表是应用程序的所有代码和数据以在片上占用的地址来分段存储的数据包,包的第一个4B 是main()函数的入口地址_C_int00,后面由若干数据段组成,每个段前4B为该段数据的字节长度Byte_count_x(x 为段序号),接着4 B Address_x 为该段在片上的存储地址,后面是Byte_count_x个字节的具体数据Data_x.所有数据段结束后是4个字节0作为根表的结束标记。该根表格式如表1所示。每一个段的数据字节数可能不是4的整数倍,根表中数据区就在后面添0按4 B的整数倍向上取整,故整个根表文件字节数必是4的整数倍。
根表数据产生很简单,由应用程序最终生成的Out文件,通过ccs自带工具hex6x.exe选择不同的参数而产生,产生的文件即是根表文件,可以选择生成二进制文件或文本文件,本研究采用二进制。其产生命令为(app为应用程序名,app.out为ccs产生的连接文件):
hex6x -boot -b -e _c_int00 -order L -memwidth=32 -romwidth=32 -o app.bin app.out
app.bin为产生的二进制根表文件,将二级Loader程序的二进制代码加到根表文件的头部即是app 应用程序的映像文件。
多核的映像文件是由二级加载器Loader和多个核应用的根表合并而成的文件。多个核对应多个独立的工程,并由CCS 产生多个out 文件,再由hex6x.exe 产生各核的根表文件。后对Core0 的根表文件先去掉末尾4 个0字节,再将各辅助核的根表文件的开始的入口地址_C_int00和末尾4个0字节去掉,加到Core0被去掉了末尾字节的根表文件后,然后再将每个核的_C_int00当成一个4字节的数据段来保存到上面的合成文件的后面,而各_C_int00在片上的存放地址即为各核的专门固定地址Boot Magic Address,如Core1 的Boot Magic Ad-dress 为0x1187fffc,Core2 为0x1287fffc,…,Core7 为0x1787fffc.所有根表数据段构成后,再将4个0字节作为结尾标志加到文件的最后,这样合并后的根表文件如表2所示。同样,将二级Loader的代码数据加到该文件头部即形成多核的映像文件。由hex6x 生成的单核根表文件到合成映像文件的产生,全是文件操作,可以用一般的C语言工具,甚至Matlab等工具都可以完成。
同表1相比,表2仅仅只是增加了所有辅助核数据段和各核的_C_int00特殊数据段而已,表头和结束字节都相同,因此完全适用于二级Loader按统一Boot Table格式搬移数据。需特别注意,各辅助核的out文件通过hex6x.exe 产生的根表数据段中,当映射到L2(0×00800000~0x0087FFFF)的范围时,与Core0 的地址是相互覆盖的,产生合成根表时必须加上各核的L2基地址0×10000000 + n*0×1000000(n 为辅助核号),如Core1 的地址0×00825000,映射为0×11825000,同样地址Core2映射为0×12825000,Core7映射为0×17825000。