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的情况还是要根据实际的编译器来计算。