本帖最后由 st316 于 2019-8-20 13:44 编辑
Hello, 我正在使用 STM32F405RGT6 芯片。有三块 RAM,分别是64 KB 的CCM,112 KB的SRAM1 和16 KB 的 SRAM2。具体如下图所示。
以下是分散加载文件相关内容:
#define SCT_SRAM_BASE (0x20000000)
#define SCT_SRAM_SIZE ( 128 * 1024)
#define SCT_SRAM_LIMIT (SCT_SRAM_BASE + SCT_SRAM_SIZE)
#define SCT_CCM_RAM_BASE (0x10000000)
#define SCT_CCM_RAM_SIZE ( 64 * 1024)
#define SCT_CCM_RAM_LIMIT (SCT_CCM_RAM_BASE + SCT_CCM_RAM_SIZE)
LR_IROM1 SCT_LR_IROM1_BASE SCT_LR_IROM1_LENGTH
{
......
RW_IRAM1 SCT_SRAM_BASE SCT_SRAM_SIZE ;SRAM1 和SRAM2,一共128 KB
{
.ANY (+RW +ZI)
}
RW_IRAM2 SCT_CCM_RAM_BASE SCT_CCM_RAM_SIZE ; CCM
{
heap_1.o (+RW +ZI)
}
}
其中,heap_1.c中有一个37500字节的数组,我将它放在 CCM 中。
余下的所有 RW 和 ZI 放在 128 KB (112 + 16) 那两块 SRAM 中。
奇怪的事情来了,请看 Keil 编译完成后的输出:
Program Size: Code=410088 RO-data=93200 <b>RW-data=1560</b> <b>ZI-data=189920
RW + ZI = 1560 + 189920 = 191480 字节。
再计算一下,可以得到实际放在 128 K SRAM 里的数据大小是 191480 - 37500 = 153980 字节,约等于 150 KB!
150 KB 数据放在 128 KB 的 SRAM 中,明显不够,可是编译器并没有报错,我的程序也运行得好好的。这是为什么?
我接着又查看了 Keil 生成的 map 文件,如下:
===============================================================
Memory Map of the image
......
Execution Region RW_IRAM2 (Base: 0x10000000, Size: <b>0x00009288</b>, Max: 0x00010000, ABSOLUTE)
Base Addr Size Type Attr Idx E Section Name Object
0x10000000 0x00000004 Data RW 7285 .data heap_1.o
0x10000004 0x00000004 PAD
0x10000008 0x00009280 Zero RW 7284 .bss heap_1.o
Execution Region RW_IRAM1 (Base: 0x20000000, Size: <b>0x00015940</b>, Max: 0x00020000, ABSOLUTE, COMPRESSED[0x00000204])
......
===============================================================
Code (inc. data) RO Data RW Data ZI Data Debug
410088 35462 93200 1560 189920 0 Grand Totals
410088 35462 93200 520 189920 0 ELF Image Totals (compressed)
410088 35462 93200 520 0 0 ROM Totals
===============================================================
Total RO Size (Code + RO Data) 503288 ( 491.49kB)
Total RW Size (RW Data + ZI Data) 191480 ( 186.99kB)
Total ROM Size (Code + RO Data + RW Data) 503808 ( 492.00kB)
===============================================================
可以看出,RW_IRAM2 中使用了 0x00009288 字节,也就是那个数组的大小,37500字节。
而 RW_IRAM1 显示却只使用了 0x00015940 字节,换算过来才86 KB 左右,这就是为什么我的程序可以正常运行的缘故吗?可是为什么只有86 KB呢?最后面给出的 RW + ZI 已经是186 KB 了呀!
麻烦知道的高手给解答一下,谢谢!
|