数组占用flash的探讨

keil中做的使用

未初始化(初始化为0)的全局(静态)数组并不会占用flash

       1.首先全局(静态)数组如果没有初始化, 则会被初始化为0.

        2.如果没有初始化的全局(静态)数组, 并不会占用flash的空间.

        3.或者char arr1[500]={0};这样初始化, 也和默认初始化一样, 不会占用flash.

        4.烧录到flash的代码由三部分组成: code+ro-data+rw-data

        5.ZI-data中的ZI 就是zero init, 因此没有初始化的全局.静态都放这个区默认初始化为0.

   

初始化的全局(静态)数组占用flash.

 从图中可以得到结论: 初始化过的数组, 增加了RW-data的量, 并且code也有部分增加.

局部数组并不会占用flash(不会随着空间的增大而暂用flash)

 初始化的局部数组会占用flash

  虽然会占用flash, 但是从编译结果来看, 初始化的数据越多占用空间越大, 因为要将这些数据记录起来, 记录就以为这需要flash了.但是这个占用的空间并不是随着默认初始化的的数据越多占用越大的, 似乎有个空间, 超过某个范围才会增加

        使用arr[100]={0}; 和使用memset(arr, 0, sizeof(arr))生成的代码空间一样.

总结

1. 如果使用全局/静态数组(变量), 可以不初始化或者初始为0, 这样就可以减少内存.

2. 如果使用局部数组(变量), 可以不初始化的最好也别初始化, 尽量减少flash.

IAR中的实验: 

 

如上如所示,flash的空间为:(374215+55871)/ 1024 = 420K. 我们的芯片是500Kflash的芯片,如果再加上readwrite data则远远超过了500K的限制,因此readwrite data没有计算在flash中,这里和keil是不同的。

iar中的readwrite data应该是keil中rw-data + zi-data的总和。就不知道是不是他也会像keil那样没有初始化的全局变量不会计算到flash中,还是已经计算到了flash中。因此关于数组这种占用flash的情况还是要根据实际的编译器来计算。 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

入门->放弃

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

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

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

打赏作者

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

抵扣说明:

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

余额充值