STM32代码中变量定义后的放置的位置

参考代码:Embedded/stm32/var_Placement · guorong/study - 码云 - 开源中国 (gitee.com)

写一个如下所示的代码,可以查看各种类型的变量的存储位置

#include"stdlib.h"
int g_var;
int g_var_init_z=0;
int g_var_init =10;
const int  c_g_var;
const int  c_g_var_z=0;
const int  c_g_var_init=20;

int main()
{
    static int s_var;
    static int s_var_init_z=0;
    static int s_var_init =30;
    int var;
    int var_init_z=0;
    int var_init =40;
    int *ptr = (int *)malloc(sizeof(int));
    int tmp= g_var+ g_var_init_z +g_var_init  + c_g_var  + c_g_var_z  + c_g_var_init + s_var + s_var_init_z +  s_var_init + var + var_init_z + var_init;
    int *p[14];
    int i=0;
    p[i++] = (int *)&g_var;         
    p[i++] = (int *)&g_var_init_z;  ;
    p[i++] = (int *)&g_var_init     ;
    p[i++] = (int *)&c_g_var       ;
    p[i++] = (int *)&c_g_var_z    ;
    p[i++] = (int *)&c_g_var_init  ;
    p[i++] = (int *)&s_var        ;
    p[i++] = (int *)&s_var_init_z ;
    p[i++] = (int *)&s_var_init  ;
    p[i++] = (int *)&var         ;
    p[i++] = (int *)&var_init_z ;
    p[i++] = (int *)&var_init;
    p[i++] = (int *)ptr;
    p[i++] = (int *)p;
    while(1)
    {

    }
}

还需要看一下map文件,先确认一下各个区域的范围

可以看出主要分为以下4个区域

  1. flash区域为0x08000000开始
  2. .bss段为0x20000000的0x74个字节
  3. 堆区为:0x20000078开始的0x200个字节
  4. 栈区为:0x20000278开始的0x400个字节

运行结果如下

可以看出结论为:

  1. 可读写的未初始化全局变量放置在bss段,并被初始化为0
  2. 可读写初始化为0的全局变量放置在bss段,并被初始化为0
  3. 可读写的初始化为10的全局变量,放置在bss段,并初始化为10
  4. 只读全局未初始化变量放在flash中,并初始化为0
  5. 只读初始化为0的全局变量放置在flash中,并被初始化为0
  6. 只读初始化为20的全局变量放置在flash中,并初始化为20
  7. 可读写的未初始化静态变量放置在bss段,并被初始化为0
  8. 可读写初始化为0的静态变量放置在bss段,并被初始化为0
  9. 可读写的初始化为30的静态变量,放置在bss段,并初始化为30
  10. 可读写的未初始化局部变量放置在栈中,值为不确定的值
  11. 可读写初始化为0的局部变量放置在栈中,并被初始化为0
  12. 可读写的初始化为40的局部变量,放置在栈中,并初始化为40
  13. malloc申请的变量,放置在堆中,值为不确定
  14. 最后一个是数组自己的地址,相当于一个局部变量,存在了栈

总结为表格如下

读写属性定义方式是否初始化最终变量放置位置初始化值
可读写全局bss段0
可读写全局0bss段0
可读写全局10bss段0
只读全局flash0
只读全局0flash0
只读全局20flash0
可读写静态bss段0
可读写静态0bss段0
可读写静态30bss段0
可读写局部不确定
可读写局部00
可读写局部4040
可读写malloc不确定
可读写局部不确定

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木草草幂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值