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