首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

c6000特别是c64x和c621x,c671x的加载(别的论坛的精华)

c6000特别是c64x和c621x,c671x的加载(别的论坛的精华)

大家可以参考一下高手的ROM加载经验,将使我们看到自己的差距

关于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存储区呢?


C6204 加载问题

我在加载FlashRom时,发现代码和初始化数据可一次自动加载到C6204的片外存储器,DSP运行正常。
TI的资料说:如果想将FlashRom中的代码加载到C6204片内程序存储器中运行,在代码自动加载结束后则必须手工将FLASHROM中的初始化数据下载到C6204的数据存储器中。可是我反复实验就是不行。请问这个手工下载的程序如何写?我是在main()函数的开始处先初始化相关的EMIF寄存器,接着调用一个数据搬移的C函数,函数如下:
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地址开始执行,就可以执行我的新的程序了。

boot

请问 galaxy你的dsp是如何与pc连接的?hpi口?为什么不用hpi口加载呢?能讲讲吗,让大家也长长经验值:)。我做5410时用的就是通过hpi口从pc104加载.




void cinitmove(void)
{
unsigned int count;
for(count=0;count<0x9B4;count++)
{
*(char *)(cinitrun+count)=*(char *)(cinitload+count);
}
}

0x9B4是数据长度,cinitload 是初始化段在Flashrom中的开始地址,cinitrun是初始化段在C6204内部的数据存储器开始地址。
返回列表