• STM32内存跟FLASH问题


    RO: 常量

    ZI: 未初始化的全局变量

    RW: 初始化的全局变量

    Code: 程序本身

    Code, RO-data,RW-data ..............flash 

    RW-data, ZIdata...................RAM

    初始化时, RW会从flash被拷贝到RAM

    Program Size: Code=1564 RO-data=336 RW-data=32 ZI-data=1832 

    Code就是flash. 证明: 我现在注释掉一行:

    //delay_ms(300);

    Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832 

    再注释一行:

    //LED1=0;

    Program Size: Code=1548 RO-data=336 RW-data=32 ZI-data=1832 

    再注释一行:

    //LED0=1;

    Program Size: Code=1544 RO-data=336 RW-data=32 ZI-data=1832 

    其他都没变, 只有Code变化了.

    以这个为基础:

    Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832 

    接下来, 加一个static的变量.

    static u8 i;

    Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832 

    发现没有任何变化, 就是静态变量, 你不赋值, 就不占任何空间, 编译器好聪明.

    接着, 声明后马上赋值:

    static u8 i=2;

    编译结果:

    Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832 

    竟然没有任何变化, 也就是说, 只是赋初始值, 也是没有使用的静态变量也不占任何空间.

    加一行代码:

    i=3;

    Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836 

    可以看到Code有变化, RW-data也增加了4个字节, 因为32位的系统的关系吧. 然后ZI也是增加了4个字节 

    如果不赋初始值, 直接后面才给i一个3:

    Program Size: Code=1568 RO-data=336 RW-data=36 ZI-data=1836 

    没变化, 即, static的变量, 申明时就赋值了.

    如果把static去掉, 在函数内申明一个普通变量i, 则:

    Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832 

    跟基础相比:

    Program Size: Code=1556 RO-data=336 RW-data=32 ZI-data=1832 

    除了Code没变化.

    增加define

    #define iah 0x0f

    Program Size: Code=1560 RO-data=336 RW-data=32 ZI-data=1832

    没有任何变化

    即编译期间, 所有define都会被自动替换.

    可见:

    1. Code就是编译后的机器码

    2. RO就是Read Only, 即常量

    3. static的变量, 在初始化的时候, 会从flash放进内存

    4. 普通变量只会在栈和堆中存在, 并存活于函数作用域, 初始化的时候并不占用内存.

    5. 只有const修饰符才会增加RO.

    参考链接:

    http://blog.csdn.net/winmenaruto/article/details/6256770

  • 相关阅读:
    借助magicwindow sdk plugin快速集成sdk
    Deeplink做不出效果,那是你不会玩!
    iOS/Android 浏览器(h5)及微信中唤起本地APP
    C#回顾 Ado.Net C#连接数据库进行增、删、改、查
    C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名
    C#中的静态方法|如何调用静态方法
    SpringBoot实体类对象和json格式的转化
    SpringBoot + kaptcha 生成、校对 验证码
    SpringBoot配置自定义美化Swagger2
    Spring Boot关于layui的通用返回类
  • 原文地址:https://www.cnblogs.com/Montauk/p/5462793.html
Copyright © 2020-2023  润新知