【单片机】C语言程序在单片机上运行时的内存分布情况
这是在电脑上C语言程序执行时内存分区情况补充.bss段也包含初始化为0的全局或静态数据.data段不包含初始化为0的全局或静态数据。在单片机上的类似情况Keil如下程序运行时单片机就只把RW-data复制到RAM中直接在ROM中运行代码。FreeRTOS申请的内存是未初始化的全局数组放在ZI-data中。初始化为0的全局变量不放在RW-data中也是为了节省ROM空间。宏定义的值在预编译时替换所以它的值是存在Code里的。在GCC编译链下dec text data bss栈和bss的位置由链接文件决定。1、修改cons修饰的变量在PC上的C语言中const修饰全局变量和局部变量直接修改都语法不通过但是通过定义一个指针指向这个变量的地址修改指针所指向的值这种情况下语法是可以通过的全局变量失败局部变量成功通过查看地址可得const修饰的全局或静态变量是放在文字常量区但局部变量还是放在栈区。类似的单片机上const修饰全局或静态变量是在RO-data但修饰的局部变量在栈区。补充结构体中部分成员用const修饰该结构体变量放在data/bss区直接修改编译不通过可以通过指针修改。2、利用const节省内存空间单片机上定义const char ary[] {0x01, 0x01, 0x01};是不占用内存空间的但是如果const修饰的内容里有函数指针同时编译工程没有指定固件的下载地址比如林洋物联表管理芯MTAPP则该变量在编译时自动转成全局变量也是需要消耗内存的。因为函数指针的值并不是一个确定的值。补充IAR的map文件最后直接显示所耗ROM和SRAM空间大小和Keil的不同如下IAR上map的框起来的ROM就是keil上CodeRO-dataRW-data框起来的SRAM就是keil上的RW-dataZI-data这个是找个项目实际验证的。补充SRAM分配上如果有没用到内存放在了最后也就是说地址比栈顶地址还大。