打印
[STM32F4]

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

[复制链接]
814|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhaoxqi|  楼主 | 2022-4-17 20:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
RW+ZI 超出了RAM大小,程序还能正常运行?

使用特权

评论回复
沙发
wyjie| | 2022-4-17 20:49 | 只看该作者

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
zhaoxqi|  楼主 | 2022-4-17 20:53 | 只看该作者
我正在使用 STM32F405RGT6 芯片。有三块 RAM,分别是64 KB 的CCM,112 KB的SRAM1 和16 KB 的 SRAM2

使用特权

评论回复
地板
zhaoxqi|  楼主 | 2022-4-17 20:55 | 只看该作者

使用特权

评论回复
5
zhaoxqi|  楼主 | 2022-4-17 21:03 | 只看该作者
以下是分散加载文件相关内容:
#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 中。

使用特权

评论回复
6
zhaoxqi|  楼主 | 2022-4-17 21:06 | 只看该作者
奇怪的事情来了,请看 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 中,明显不够,可是编译器并没有报错,我的程序也运行得好好的。这是为什么?

使用特权

评论回复
7
zhaoxqi|  楼主 | 2022-4-17 21:10 | 只看该作者
我接着又查看了 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 左右,这就是为什么我的程序可以正常运行的缘故吗?

使用特权

评论回复
8
zhaoxqi|  楼主 | 2022-4-17 21:13 | 只看该作者
可是为什么只有86 KB呢?最后面给出的 RW + ZI 已经是186 KB 了呀!

使用特权

评论回复
9
dengdc| | 2022-4-17 21:15 | 只看该作者
你该检查.map文件中每一个变量的分配位置

使用特权

评论回复
10
zhenykun| | 2022-4-17 21:17 | 只看该作者
如果没有超出范围的变量,则代码没问题

使用特权

评论回复
11
stly| | 2022-4-17 21:19 | 只看该作者
编译器除了需要heap,还需要堆栈,全局静态变量等,都定义在ZI段,正常编译没出问题,说明变量空间都有效。

使用特权

评论回复
12
pengf| | 2022-4-17 21:22 | 只看该作者
__align(4) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));      
程序里面有没有类似这样的代码?

使用特权

评论回复
13
huangchui| | 2022-4-17 21:25 | 只看该作者
这个应该不能运行了呢。      

使用特权

评论回复
14
jlyuan| | 2022-4-17 21:27 | 只看该作者
可以把一些变量合并使用的。      

使用特权

评论回复
15
llljh| | 2022-4-17 21:29 | 只看该作者

还能超出ram范围了?            

使用特权

评论回复
16
dengdc| | 2022-4-17 21:31 | 只看该作者
看来只能换其他的芯片了。      

使用特权

评论回复
17
llljh| | 2022-4-17 21:37 | 只看该作者
至今没有写超出范围的程序。   

使用特权

评论回复
18
juventus9554| | 2022-4-17 21:42 | 只看该作者
楼主的问题解决了吗           

使用特权

评论回复
19
dengdc| | 2022-4-17 21:45 | 只看该作者
程序运行有问题吗?      

使用特权

评论回复
20
zhanghqi| | 2022-4-17 21:47 | 只看该作者
可能程序保存的格式不同吧  

使用特权

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

本版积分规则

808

主题

10636

帖子

4

粉丝