搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2012-4-4 09:01:39 | 显示全部楼层 |阅读模式
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;
}
并没有任何跳转动作,这是为何?

阿莫论坛20周年了!感谢大家的支持与爱护!!

该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981

出0入0汤圆

 楼主| 发表于 2012-4-4 09:09:04 | 显示全部楼层
啊~肿么都没有淫回答~~顶上去

出0入0汤圆

 楼主| 发表于 2012-4-4 16:59:50 | 显示全部楼层
难道是论坛人气减少了??貌似DSP版块一直就不是很火~~

出0入0汤圆

发表于 2012-4-4 17:15:33 | 显示全部楼层
这个和连接器相关,别人如果没有和你一样的开发环境,就不好回答你的问题,如arm上,mdk和iar实现的方法就不一样,不过异曲同工,毕竟最后的目标相同

出0入0汤圆

发表于 2012-4-4 17:18:18 | 显示全部楼层
以前看过,记不太清了,你看看CMD文件,还有initflash()函数的定义,应该是编译的时候就定位到RAM里了。

出0入0汤圆

 楼主| 发表于 2012-4-4 18:51:09 | 显示全部楼层
本帖最后由 hacker9 于 2012-4-4 18:52 编辑

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

出0入0汤圆

发表于 2012-5-2 22:10:40 | 显示全部楼层
代码看起来, 这个函数作了 relocate 的动作:
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

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

出0入0汤圆

发表于 2012-6-30 19:11:39 | 显示全部楼层
问你个问题。DSp的程序可以完全在FLASH中运行么?速度可以达到多少,能适应AD采样么?

出0入0汤圆

发表于 2012-11-16 19:31:54 | 显示全部楼层
hacker9 发表于 2012-4-4 18:51
我明白了,并不是从flash交接到ram了,根据单步调试来看,注释掉memcopy后两者完全相同,memcopy函数在flash ...

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

出0入0汤圆

发表于 2013-8-15 01:14:32 | 显示全部楼层
wangzheyu 发表于 2012-11-16 19:31
楼主讨论的这个问题很好,不过没有什么人回答,不知道楼主现在知道了吗 ...

顶起!     

出0入0汤圆

发表于 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中运行,无缝切换。

出0入0汤圆

发表于 2013-8-15 16:20:52 | 显示全部楼层
steaven2000 发表于 2013-8-15 09:54
这么几个概念希望对楼主有帮助:
1、代码在Flash里面跑和在RAM里面跑:据说在Flash里面跑时,实际的运行速 ...

仁兄才是大牛!!

出0入0汤圆

发表于 2013-8-15 17:21:23 | 显示全部楼层
steaven2000 发表于 2013-8-15 09:54
这么几个概念希望对楼主有帮助:
1、代码在Flash里面跑和在RAM里面跑:据说在Flash里面跑时,实际的运行速 ...

感谢!
高手 ,请教这部分内容在哪儿能够详细读到?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-1 16:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表