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