关于C6000DSP的ROM加载
1、TI的资料上的说明如下:
位于CE1空间的ROM中的代码首先通过DMA/EDMA被搬入地址0处。加载过程在复位信号撤消之
后开始,此时CPU内部保持复位状态,由DMA/EDMA执行1个单帧的数据块传输。传输完成后,CPU
退出复位状态,开始执行地址0处的指令。对于C62x/C67x,用户可以指定外部加载ROM的存储
宽度,EMIF会自动将相邻的8bit/16bit数据合成为32bit的指令。对C620x/C670x,ROM中的程序
必须按little-endian的存储模式存储;对C621x/C671x,ROM中的程序存储格式应当与芯片的
endian模式设置一致。C64x只支持8bit的ROM加在,ROM中的程序存储格式需要与芯片的endian
模式设置一致。对于不同的芯片,加载过程还略有不同。
★ 对C620x/C670x,DMA从CE1空间中拷贝64KB数据到地址0处
★ 对C621x/C671x/C64x,EDMA从CE1空间(对C64x是EMIFB的CE1空间)中拷贝1KB数据到地
址0处
2、EEWORLD的疑难解答关于C6000加载描述如下:
C6000的boot loader在reset时,判断外部BOOTMODE管脚,从而决定boot的方式为RAM加载、
ROM加载还是HPI加载,RAM可以为SDRAM、SBSRAM或SRAM,ROM可以为8位。C6000的boot的代码
长度较小,为1K,一般这1k的程序一个是用户自己的boot程序,用于再次boot应用程序到RAM
中。
3、TROY的解答(CMD 文件此处未列出):
671x复位时,将0x90000000开始的1k内容(FLASH_BOOTCODE即.boot_load段)复制到DSP内
0x00000000处执行,该段程序将表中所指的各程序或数据段复制到SDRAM中,这时DRAM中的内容
与用仿真器加载未经修改cmd的程序时完全相同,所以最后要做的就是跳转到你的程序入口点
(c_int00)。这时boot程序已无任何用处。
上面所说的C64x的加载过程无非是:Reset后DSP前面1K字节的空间放置了我的bootloader,
然后我的bootloader程序运行将余下的程序和初始化数据代码再load进来。
这个过程不难理解,问题是:
1)、bootloader程序怎么编写,以前没有编过,哪位高手有例子?
2)、上面有提到“最后跳转到你的程序入口点(c_int00)。”,如果用汇编我见过如何
跳转,但是不过我的bootloader程序是用c语言编的该如何编写呢?是不是先设置PC(Program
Counter)再跳转呢?c_ini00是不是bootloader加载程序时存放代码的首地址?两个完全独立
的程序怎么跳转?嵌汇编“B .S1 LABEL\"不知可不可以,LABEL可以为c_int00的绝对地址吗?
如:“B .S1 0x8000000“. 或者是“BNOP .S2,B3,5“;其中B3中有c_int00的绝对地址。还有就
是bootloader程序和用户代码分别单独编译吗?链接(link)呢,是单独分开还是一块链接?
如果是单独分开的那么bootloader怎么能识别符号“c_int0”呢?
3)、上面讲的大多是flash如果换成eprom,不知如何将booloader程序和我的用户代码同时
烧到同一片eprom中去呢?
4)、还有一个问题,其实不是很重要,以前也有人问过但没有得到很好的回答,就是已开
始加载的1KB bootloader程序在完成它的搬运功能后“已无任何用处”,那问题是这1KB存储区
岂不浪费了,有没有什么好的方法可以“回收“这1KB存储区呢? |