[ZLG-ARM] 看我是如何在LPC2214上实现把代码copy到SRAM中运行

[复制链接]
3302|6
 楼主| vimman 发表于 2007-8-2 16:30 | 显示全部楼层 |阅读模式
LPC2214的SRAM虽然只有16K,但把代码和数据一起放到上面还是有机会的,比如你写的程序小到一定程度而且要求效率的时候可以尝试;本人以ZLG模板为基础在keil&nbsp;uvsion3实现了,但是还有很多不明白的地方,希望大侠指教啊!<br />一、修改scf如下:<br />ROM_LOAD&nbsp;0x0<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ROM_EXEC&nbsp;0x00000000<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Startup.o&nbsp;(vectors,&nbsp;+First)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*armlib*&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;anon$$obj.o&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.o&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;RAM_EXEC&nbsp;0x40000044<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RO)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRAM&nbsp;0x40003000<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Startup.o&nbsp;(MyStacks)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;(+RW,+ZI)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQSTACK&nbsp;0x40003080&nbsp;UNINIT<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IrqStack.o&nbsp;(IrqStack)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HEAP&nbsp;+0&nbsp;UNINIT<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heap.o&nbsp;(+ZI)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;STACKS&nbsp;0x40004000&nbsp;UNINIT<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.o&nbsp;(+ZI)<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />其中&nbsp;*armlib*&nbsp;(+RO)是把rv的库函数定位,可以在rv_link.pdf中找到说明;anon$$obj.o&nbsp;(+RO)这个本人没弄明白是怎么生成的,好像是一个跳转表,是通过map文件看出来的;把跟启动代码相关的只执行一次的代码放到内部flash中,把应用层代码放到sram中;同时仿照stack.s增加了irqStack.s,这样做是为了避免IRQ时再去读取flash中的文字池。&nbsp;&nbsp;RAM_EXEC&nbsp;0x40000044&nbsp;之所以没有从0x40000000开始是为了留出SRAM中断向量的位置。<br />二、修改startup.s:<br /><br />初始化堆栈后添加以下代码<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;#0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;#0x40000000<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R3,&nbsp;Vend<br />CopyVec&nbsp;CMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R2,&nbsp;R3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDRLO&nbsp;&nbsp;&nbsp;R0,&nbsp;[R1],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STRLO&nbsp;&nbsp;&nbsp;R0,&nbsp;[R2],&nbsp;#4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BLO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CopyVec<br />Vend&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40000040<br />&nbsp;copy中断向量到SRAM,copy代码段到SRAM,调至__main后rv的库函数会scatter&nbsp;load相应的代码到sram中。这中间不要忘记设置MEMMAP=0x2,将向量映射到SRAM。<br />这样程序就可以在内部SRAM中运行起来了。<br />
gotomy 发表于 2008-5-5 08:57 | 显示全部楼层

留位

  
WGC204 发表于 2009-11-19 11:08 | 显示全部楼层
楼主能否给个代码包,让俺学习看看,多谢谢!
mail:wgc204@163.com
linhai1986 发表于 2009-11-20 00:09 | 显示全部楼层
这个很好,赞一下
linhai1986 发表于 2009-11-20 00:10 | 显示全部楼层
不知LZ在哪找到的这个资料?
xiaoxin1986 发表于 2009-11-20 23:42 | 显示全部楼层
LZ很厉害
xiaoxin1986 发表于 2009-11-20 23:43 | 显示全部楼层
支持支持,希望有跟多这中学习资料
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

81

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部