0 导言
在视频检测、医疗印象及红外图画快速跟瞄体系使用中,越来越杂乱的二维、三维乃至四维的图画处理,需求并行化的处理体系,并能够运转杂乱的算法。要完结这些杂乱的体系,高端FPGA+高功用DSP是现在遍及选用的计划,而单个DSP的功用已开展至极限,所以处理杂乱的并行算法,多核DSP是现在开展的全新方向,其间多核DSP的根加载技能是其难点之一。
TI公司推出的DSP芯片TMS320C6678(C6678)具有8个内核的高功用DSP,每个内核作业频率均达1 GHz。
其支撑的Boot 形式有SPI、I2C、EMAC、SRIO 和并口Emif16 NOR-FLASH。其间Emif16 NOR-FLASH形式是不必上位机参加、比较简单、独立成体系的一种,大多独立DSP体系选用该方法。
网上能查找到关于C6472和C6678零散一些加载材料,都是借助于第三方转化东西,太过于抽象。下面是针对C6678 的并口Emif16NOR-FLASH的上电加载作详细的讨论。
1 C6678 的上电加载进程
所谓上电加载(上电自举),便是当DSP复位后,正常运转用户程序之前运转的一段小程序,就像PC机的BIOS 相同。多核加载同单核加载差异很大,不但要担任主核的加载并且还有其他核的加载与激活。C6678的Emif16 NOR-FLASH 能够直接履行程序(XIP)(这与C641x系列DSP不同),其上电加载进程示于图1。
上电复位后,DSP 首要运转固化在片上ROM坐落地址0x20b00000的程序,称为片上Loader,片上Loader依据DSP硬件管脚状况,判别用户选用的Boot形式以跳转到相应形式的二级加载程序。如图1的 Emif16 NOR-FLASH形式中,运转片上Loader后,PC指针直接指向NOR-FLASH首地址0×70000000并开端履行FLASH上的二级Loader程序,二级Loader存储在FLASH开端地址0×70000000~0×70000400的规模内。从0×70000400开端保存使用程序的根表数据(即被烧烧写到FLASH中的使用程序的数据)。二级Loader的功用是将保存在 FLASH中的Core0~Core7的根表数据搬移到DSP相应的地址段内,搬移完后,二级Loader程序PC指针跳到Core0的主程序进口地址_c_int00处,开端履行Core0的使用程序。在Core0的使用程序开端加有使其他核激活运转的代码(这也是有别于单核的特别之处),至此整个多核加载就此完结。事实上,假如你的使用程序很小,且运转速度要求不高,图1中的2、3和4进程都能够不要,只要把使用程序的原始代码数据烧写到FLASH从0×70000000开端的方位,上电正常运转即可(这在C641x 上是不可的),如此DSP 的许多高功用就表现不出来,且多核工程大多选用嵌入式sysbios工程,占用存储器比较大,所以正常的Boot进程有必要选用图1所示的二级加载进程。
从图1中看出,一个完好多核加载进程,开发者需求做的是二级加载器Loader的编写、FLASH中映像文件的发生、FLASH烧写器的编写,主核对各辅佐核的触发代码的编写(被加载的使用程序不在本规模内)。
2 多核映像文件的组成与发生
映像文件便是用户要烧写到外部FLASH上的悉数数据文件,它是由二级加载器Loader的代码数据(在文件前部)和使用程序的根表(Boot Table)数据(文件后部)的组成数据文件。单核和多核的二级Loader 都相同,差异便是后部的根表数据。根表是使用程序的一切代码和数据以在片上占用的地址来分段存储的数据包,包的第一个4 B 是main()函数的进口地址_C_int00,后边由若干数据段组成,每个段前4 B为该段数据的字节长度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。