[转帖] [经典]C6000特别是C64x和C621x,C671x的加载综合说明
- UID
- 19091
- 性别
- 男
|
[转帖] [经典]C6000特别是C64x和C621x,C671x的加载综合说明
[讨论一]
关于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、合众达的疑难解答关于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存储区呢? |
|
|
|
|
|
- UID
- 19091
- 性别
- 男
|
[讨论二]
C6204 加载问题
我在加载FlashRom时,发现代码和初始化数据可一次自动加载到C6204的片外存储器,DSP运行正常。
TI的资料说:如果想将FlashRom中的代码加载到C6204片内程序存储器中运行,在代码自动加载结束后则必须手工将FLASHROM中的初始化数据下载到C6204的数据存储器中。可是我反复实验就是不行。请问这个手工下载的程序如何写?我是在main()函数的开始处先初始化相关的EMIF寄存器,接着调用一个数据搬移的C函数,函数如下:
void cinitmove(void)
{
unsigned int count;
for(count=0;count<0x9B4;count++)
{
*(char *)(cinitrun+count)=*(char *)(cinitload+count);
}
}
0x9B4是数据长度,cinitload 是初始化段在Flashrom中的开始地址,cinitrun是初始化段在C6204内部的数据存储器开始地址。
——————————————————————————————————————————
[讨论三]
boot
对于c620x你这样做是可以的,其实有些初始化数据,只是在开始用到,就不用copy到dsp内部,不会怎么影响速度的,但必须把它的rub地址设正确。6211不知你做没做过大家交流交流,我正在搞64x,他的加载与6211,6711类似;需要自己编一个bootloader 程序,我在ti的资料中找到这样的一个用qdma搬运的汇编程序,非常简单,但就是有一点不明白,就是搬运程序最后如何跳到c_int00。我的理解是bootloader于用户代码处于同一个工程中,因为只有这样才能在bootloader中用.ref引用标号“c_int00".不知我理解是否正确
——————————————————————————————————————————
[讨论四]
我曾经做过一个C6711的,系统reset时,从片外读取1k的bootloader程序。但是我主要的程序是需要通过PC下载到DSP进行运行的。所以,我的bootloader程序的功能就是与PC通讯,接收完主程序放在片外RAM中,接收完成以后,把这部分程序拷贝到片内(覆盖掉原bootloader程序),然后从0地址开始执行,就可以执行我的新的程序了。 |
|
|
|
|
|
- UID
- 19091
- 性别
- 男
|
[讨论一]boot
请问 galaxy你的dsp是如何与pc连接的?hpi口?为什么不用hpi口加载呢?能讲讲吗,让大家也长长经验值:)。我做5410时用的就是通过hpi口从pc104加载.
——————————————————————————————————————————
[讨论五]
请教[讨论四]我也是用6711但是我遇到一个大麻烦呀,请教您呀
我用的是6711,6711在DSP上电RESET后,会自动从FLASH中读取1K的CODE到 ON-CHIP RAM中,所以实际上 就是在这1K的代码中要完成EMIF初始化和把1K后的CODE引导到RAM上,但是我在CCS中只定义了一个函数,编译后TEXT段就有1。5K,奇怪的是我函数里面任何执行代码都没有写呀,仅仅定义了一个“MAIN”函数,TEXT段怎么就超过了1。5K了?所以,实际上不论我怎么写程序,上电后被BOOTLOAD的1K代码实际上根本就不会有任何的执行代码的,因为我定义一个函数后TEXT段就超过了1K了。小弟很着急,麻烦老兄给解释一下好吗?
——————————————————————————————————————————
[讨论四]
1.(to [讨论一])当时是帮同学调试usb通讯时做的,系统最终采用的还是hpi口的方式。
2.(to [讨论五])我当时是直接用汇编写的,没有用c。我估计应该是c环境的一些变量和程序,你可以用-m选项看看编译后的空间分配情况。或者你直接改成用汇编好了,很简单的。 |
|
|
|
|
|