C语言程序的存储区域分类:
1. 代码段(code):由各个函数产生(FLASH)
2. 只读数据段(RO data):常量(FLASH)
3. 已初始化读写数据段(RW data)
4. 未初始化读写数据段(BSS):只有声明。没有初始化的变量。
5. 堆(heap):只在程序运行时出现,一般有程序员分配和释放。free mallco、new
6. 栈 (stack):只在程序运行时出现,局部变量和函数的参数以及返回值,由编译器自动分配和释放。
二、一般mcu包含的存储空间
片内FLAH:对应硬盘,其内置的 Flash 就是使用的是 Nor Flash
,因为其中一个特点是支持芯片内执行(XIP
:eXecute In Place
),就是应用程序可以直接在 flash 闪存内运行,而不要先拷贝到 RAM 中,然后程序在 RAM 中执行。NOR
的读速度比 NAND
快一些
片内RAM:对应运行内存。
IAR编译器:
Readonly code Memory 只读代码段
Readonly data Memary 只读数据段
readwrite data Memary 读写数据段
三个之和为 烧写程序所占的FLASH存储空间。
Keil编译器
RO size = code + RO data 程序占用FLASH的空间大小
RW size = RW data(初始化为非零的全局变量) + ZI data(0数据段,存放未初始化的全局变量和初始化为0的变量)运行时占用RAM的大小
ROW size = code + RO data + RW data 烧写程序所占FLASH空间的大小。
生命周期与作用域的角度
const 关键字:作用是限定一个变量不允许被改变。
c语言中 const 全局变量存储在只读数据段,编译期最初将其保存在符号表中(const 全局有的编译器直接当立即数存在ROM
中),第一次使用时为其分配内存,在程序结束时释放。
而const局部变量(局部变量就是在函数中定义的一个const变量,) 存储在栈中,代码块结束时释放。
在c语言中可以通过指针对 const 局部变量进行修改,而不可以对 const 全局变量进行修改。因为 const 全局变量是存储在只读数据段。《c语言中const修饰的局部变量和全局变量存放在哪个区域》
static 关键字:(隐匿)
1、在修饰变量的时,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
2、static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
3、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。
volitail 关键字:一个函数用了一个外部的变量,但这个变量在此函数中没有改变,只是引用,这时候编译器会去做优化,把它的值暂放在内部寄存器中,用的时候读取的是寄存器的值,而不是去访问它的地址取值,这样的话,当这个变量在外部发生了变化的时候,比如中断,或者另外的进程等等。但在这个函数里面就不能起作用,因为被优化后使用的是寄存器的值,还是原来的值,导致错误发生。这种情况下,就要加上这个定义,就不会被优化了。