打印
[STM32F4]

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

[复制链接]
1667|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。具体如下图所示。



以下是分散加载文件相关内容:
#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 | 只看该作者
这个应该不能运行了呢。      

使用特权

评论回复
5
pklong| | 2019-6-10 16:18 | 只看该作者
可以把一些变量合并使用的。      

使用特权

评论回复
6
touser| | 2019-6-10 16:18 | 只看该作者
还能超出ram范围了?            

使用特权

评论回复
7
myiclife| | 2019-6-10 16:19 | 只看该作者
看来只能换其他的芯片了。      

使用特权

评论回复
8
uytyu| | 2019-6-10 16:19 | 只看该作者
至今没有写超出范围的程序。   

使用特权

评论回复
9
iyoum| | 2019-6-10 16:19 | 只看该作者
楼主的问题解决了吗           

使用特权

评论回复
10
jkl21| | 2019-6-10 16:19 | 只看该作者
程序运行有问题吗?      

使用特权

评论回复
11
maqianqu| | 2019-6-10 16:20 | 只看该作者
可能程序保存的格式不同吧  

使用特权

评论回复
12
wwppd| | 2019-6-10 16:20 | 只看该作者
编译器显示的跟下载的不一样的。

使用特权

评论回复
13
dspmana| | 2019-6-10 16:20 | 只看该作者
程序如果没有报错就没有问题 。  

使用特权

评论回复
14
wakayi| | 2019-6-18 12:46 | 只看该作者
当然不可以了

使用特权

评论回复
15
wowu| | 2019-6-18 12:47 | 只看该作者
楼主换芯片吧

使用特权

评论回复
16
xiaoqizi| | 2019-6-18 12:51 | 只看该作者
选一个ram大点的芯片吧

使用特权

评论回复
17
木木guainv| | 2019-6-18 12:56 | 只看该作者
换一个大ram的芯片

使用特权

评论回复
18
菜鸟实名认证| | 2020-4-13 14:54 | 只看该作者
我有遇到同样的情况,我的分散加载文件.sct里将没有使用到的ROM空间,使用“EMPTY”关键字去除警告,去掉“EMPTY”之后,重新编译一下,查看MAP文件就会有变化了。属于编译器的一个小bug吧,将没有使用到的“EMPTY”空间计算进去了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝