hacker9 发表于 2012-4-4 09:01:39

DSP从flash运行时,flash和ram是怎样交接的?

void main()
{
....
InitSysCtrl();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();       
while(1);
}
initFlash()函数必须在ram中运行,因为在flash中运行将自己初始化将出现不可预料错误。
也就是说,dsp从flash启动进入main,然后拷贝代码后,就实现了从flash跳到ram的过程,但是查看MemCopy()
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
    while(SourceAddr < SourceEndAddr)
    {
       *DestAddr++ = *SourceAddr++;
    }
    return;
}
并没有任何跳转动作,这是为何?

hacker9 发表于 2012-4-4 09:09:04

啊~肿么都没有淫回答~~顶上去

hacker9 发表于 2012-4-4 16:59:50

难道是论坛人气减少了??貌似DSP版块一直就不是很火~~

cht-rtos 发表于 2012-4-4 17:15:33

这个和连接器相关,别人如果没有和你一样的开发环境,就不好回答你的问题,如arm上,mdk和iar实现的方法就不一样,不过异曲同工,毕竟最后的目标相同

ringan865 发表于 2012-4-4 17:18:18

以前看过,记不太清了,你看看CMD文件,还有initflash()函数的定义,应该是编译的时候就定位到RAM里了。

hacker9 发表于 2012-4-4 18:51:09

本帖最后由 hacker9 于 2012-4-4 18:52 编辑

我明白了,并不是从flash交接到ram了,根据单步调试来看,注释掉memcopy后两者完全相同,memcopy函数在flash里,initflash在ram里,后面的所有函数仍然是在flash里运行,只是如果没有执行memcopy的话,执行initflash到后面几句就会跳转到user中断的死循环里。…………不明白memcopy到底拷贝了什么数据,求解答

mangocity 发表于 2012-5-2 22:10:40

代码看起来, 这个函数作了 relocate 的动作:
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

你应该看一下链接脚本, initflash 标号的位置应该处于RamfuncsLoadStart, RamfuncsLoadEnd这两个标号之间.

zccmymail 发表于 2012-6-30 19:11:39

问你个问题。DSp的程序可以完全在FLASH中运行么?速度可以达到多少,能适应AD采样么?

wangzheyu 发表于 2012-11-16 19:31:54

hacker9 发表于 2012-4-4 18:51 static/image/common/back.gif
我明白了,并不是从flash交接到ram了,根据单步调试来看,注释掉memcopy后两者完全相同,memcopy函数在flash ...

楼主讨论的这个问题很好,不过没有什么人回答,不知道楼主现在知道了吗

youpeng 发表于 2013-8-15 01:14:32

wangzheyu 发表于 2012-11-16 19:31 static/image/common/back.gif
楼主讨论的这个问题很好,不过没有什么人回答,不知道楼主现在知道了吗 ...

顶起!   

steaven2000 发表于 2013-8-15 09:54:44

这么几个概念希望对楼主有帮助:
1、代码在Flash里面跑和在RAM里面跑:据说在Flash里面跑时,实际的运行速度大概在60-70MPS@100MHz SysClock, 在RAM里面跑时能达到100MPS@100MHz。
   显然RAM里面跑效率高,但是由于DSP RAM的限制,一般只能把部分函数放在RAM中跑。
2、代码中函数前面有ramfunc标识的,表明这个函数需要在RAM中运行,比如一些对运行时间非常敏感的函数,如中断处理,控制算法等。Init_Flash是一个特例,必须在RAM中运行。
3、MemoryCopy仅仅是一个数据移动的过程,代码也是数据嘛,代码在编译时声称的out文件是用来烧录在flash中的,那么怎样让这部分代码在RAM中运行呢,那就需要从flash搬运到
   RAM中,即MemoryCopy。有些编译器,如IAR for ARM,以__ramfunc声明的函数不需要用户做任何搬运处理,这部分在初始化时由编译器生成的代码自动完成这个过程。
   再回过头来,CCS需要用户做这个标准的搬运动作,而且仿真运行时可以看到PC指向的都是RAM地址而不是Flash地址,说明代码确实是在RAM中运行。
4、怎么交接?不解释,CCS帮你做了。对于用户而言,直观的表现就是你需要在flash中运行的代码在flash中运行,需要在RAM中运行的代码在ram中运行,无缝切换。

siyeb 发表于 2013-8-15 16:20:52

steaven2000 发表于 2013-8-15 09:54 static/image/common/back.gif
这么几个概念希望对楼主有帮助:
1、代码在Flash里面跑和在RAM里面跑:据说在Flash里面跑时,实际的运行速 ...

仁兄才是大牛!!

youpeng 发表于 2013-8-15 17:21:23

steaven2000 发表于 2013-8-15 09:54 static/image/common/back.gif
这么几个概念希望对楼主有帮助:
1、代码在Flash里面跑和在RAM里面跑:据说在Flash里面跑时,实际的运行速 ...

感谢!
高手{:handshake:} ,请教这部分内容在哪儿能够详细读到?
页: [1]
查看完整版本: DSP从flash运行时,flash和ram是怎样交接的?