[STM32F4] RW+ZI 超出了RAM大小,程序还能正常运行?

[复制链接]
3163|17
 楼主| st316 发表于 2019-6-3 17:50 | 显示全部楼层 |阅读模式
本帖最后由 st316 于 2019-8-20 13:44 编辑

Hello, 我正在使用 STM32F405RGT6 芯片。有三块 RAM,分别是64 KB 的CCM,112 KB的SRAM1 和16 KB 的 SRAM2。具体如下图所示。
2019-06-03_17-28-27.jpg


以下是分散加载文件相关内容:
#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 了呀!


麻烦知道的高手给解答一下,谢谢!

kingkits 发表于 2019-6-4 09:35 | 显示全部楼层
你该检查.map文件中每一个变量的分配位置,如果没有超出范围的变量,则代码没问题,编译器除了需要heap,还需要堆栈,全局静态变量等,都定义在ZI段,正常编译没出问题,说明变量空间都有效。
奋斗小范 发表于 2019-6-6 12:26 | 显示全部楼层
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));       
程序里面有没有类似这样的代码?
htmlme 发表于 2019-6-10 16:18 | 显示全部楼层
这个应该不能运行了呢。      
pklong 发表于 2019-6-10 16:18 | 显示全部楼层
可以把一些变量合并使用的。      
touser 发表于 2019-6-10 16:18 | 显示全部楼层
还能超出ram范围了?            
myiclife 发表于 2019-6-10 16:19 | 显示全部楼层
看来只能换其他的芯片了。      
uytyu 发表于 2019-6-10 16:19 | 显示全部楼层
至今没有写超出范围的程序。   
iyoum 发表于 2019-6-10 16:19 | 显示全部楼层
楼主的问题解决了吗           
jkl21 发表于 2019-6-10 16:19 | 显示全部楼层
程序运行有问题吗?      
maqianqu 发表于 2019-6-10 16:20 | 显示全部楼层
可能程序保存的格式不同吧  
wwppd 发表于 2019-6-10 16:20 | 显示全部楼层
编译器显示的跟下载的不一样的。
dspmana 发表于 2019-6-10 16:20 | 显示全部楼层
程序如果没有报错就没有问题 。  
wakayi 发表于 2019-6-18 12:46 | 显示全部楼层
当然不可以了
wowu 发表于 2019-6-18 12:47 | 显示全部楼层
楼主换芯片吧
xiaoqizi 发表于 2019-6-18 12:51 | 显示全部楼层
选一个ram大点的芯片吧
木木guainv 发表于 2019-6-18 12:56 | 显示全部楼层
换一个大ram的芯片
菜鸟实名认证 发表于 2020-4-13 14:54 | 显示全部楼层
我有遇到同样的情况,我的分散加载文件.sct里将没有使用到的ROM空间,使用“EMPTY”关键字去除警告,去掉“EMPTY”之后,重新编译一下,查看MAP文件就会有变化了。属于编译器的一个小bug吧,将没有使用到的“EMPTY”空间计算进去了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

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