感谢again_gyf的提示,原来从来没有关心过编译器提供的文档,都是在网络寻找为主,结果这次找不到,才到bbs上问了半天,好在楼上的兄台一语道破天机,才让我恍然大悟,原来还有用户手册可以看,实在惭愧。
开发手册,知道了IAR的RAM / ROM是可以指定范围的,而且比较灵活,给出了三种运算方式 | & - 有了这三种方式,就可以很灵活的定义你的RAM ROM的空间了,而且计算很方便。我在ICF中给出了RAM 的范围
define region RAM_region=mem:[from 0x20000000 to 0x6800ffff]-mem:[from 0x20002000 to 0x68000000];
编译后查看MAP 文件
"A1": place at mem:0x8000000 { ro section .intvec };
"P1": place in [from mem:0x8000000 to mem:0x807ffff] { ro };
"P2": place in [from mem:0x20000000 to mem:0x20001fff] |
[from mem:0x68000001 to mem:0x6800ffff] {
rw, block CSTACK, block HEAP };
这说明和预期的范围是一致的,然后我在程序中定义了大量的数组,在编译器中选择不优化(怕把没什么用的数组优化掉)然后再查看map文件,它告诉我RAM的使用情况
"P2", part 1 of 4: 0x7d4
CSTACK 0x20000000 0x400 <Block>
CSTACK uninit 0x20000000 0x400 <Block tail>
HEAP 0x20000400 0x200 <Block>
HEAP uninit 0x20000400 0x200 <Block tail>
.iar.dynexit 0x20000600 0x1d4 <Block>
.iar.dynexit uninit 0x20000600 0xc cppinit.o [3]
.iar.dynexit uninit 0x2000060c 0x1c8 <Block tail>
- 0x200007d4 0x7d4
"P2", part 2 of 4: 0x98
.bss zero 0x200007d4 0x50 xfiles.o [3]
.bss zero 0x20000824 0x14 xsyslock.o [3]
.bss zero 0x20000838 0x10 main.o [1]
.bss zero 0x20000848 0x8 xxmemxmalloc.o [3]
.bss zero 0x20000850 0x4 main.o [1]
.bss zero 0x20000854 0x4 xgetmemchunk.o [3]
.bss zero 0x20000858 0x4 MtxWrapper.o [3]
.bss zero 0x2000085c 0x4 MtxWrapper.o [3]
.bss zero 0x20000860 0x4 MtxWrapper.o [3]
.bss zero 0x20000864 0x4 MtxWrapper.o [3]
.bss zero 0x20000868 0x4 iarwstd.o [5]
- 0x2000086c 0x98
"P2", part 3 of 4: 0x14a
P2 s0 0x2000086c 0x14a <Init block>
.data inited 0x2000086c 0x84 setlocale.o [3]
.data inited 0x200008f0 0x4c localeconv.o [3]
.data inited 0x2000093c 0x40 xfiles.o [3]
.data inited 0x2000097c 0x10 stm32_eval.o [1]
.data inited 0x2000098c 0x10 stm32f10x_rcc.o [1]
.data inited 0x2000099c 0x8 stm32_eval.o [1]
.data inited 0x200009a4 0x8 stm32_eval.o [1]
.data inited 0x200009ac 0x4 stm32f10x_rcc.o [1]
.data inited 0x200009b0 0x4 cppinit.o [3]
.data inited 0x200009b4 0x2 stm3210e_eval_lcd.o [1]
- 0x200009b6 0x14a
"P2", part 4 of 4: 0xfa04
.bss zero 0x68000004 0x3200 main.o [1]
.bss zero 0x68003204 0x3200 main.o [1]
.bss zero 0x68006404 0x3200 main.o [1]
.bss zero 0x68009604 0x3200 main.o [1]
.bss zero 0x6800c804 0x3200 main.o [1]
.bss zero 0x6800fa04 0x2 stm3210e_eval_lcd.o [1]
- 0x6800fa06 0xfa02
这说明分配的空间在连接时会自己定位,这样我的目的就达到了。
再次感谢楼上的兄弟,不是我懒,实在是没想到看手册,也可以说明平时的开发习惯不好。问题总结道这里,希望对需要有类似应用的朋友有帮助。