Flash:相当于是硬盘,程序和常量存储在这里。存长期存储的,不可变的部分。
SRAM:相当于内存,变量存在这里。存临时存储的,经常变的部分。
示例:指出下面的各个部分存在单片机的Flash还是RAM中
1234567 | UART_HandleTypeDef huart1;//huart1是一个句柄,是变量,存在SRAM中 uint8_t val = 36;//这里分成2个部分,uint8_t val是可变的,存在SRAM中,初值36不会改变,因此36这个数字保存在Flash中 const char *str = "This is a demo string";//这里分成2个部分,const char *str是可变的,存在SRAM中,This is a demo string不会改变,因此保存在Flash中 int *pBuffer = (int*)malloc(sizeof(int)*10);//这10个字节是可读写的,分配在SRAM中。 |
变量在SRAM中是以段的形式保存的。
| .data段 | .bss段 | .heap段 | 未分配区域 | .stack段 |
|---|---|---|---|---|
| 有初值的 全局变量或静态变量 | 无初值 或初值是0的 全局变量或静态变量 | 堆 malloc()分配的内存 | 栈 局部变量、参数等 (不包括静态局部变量) | |
| ——> 向后生长 | <—– 向前生长 |
Minimum Heap Size:最小堆尺寸,定义Heap段长度,默认512字节(0x200)
Minimum Stack Size:最小栈尺寸,定义Stack段长度,默认1024字节(0x400)
示例:指出下面的变量保存在SRAM哪个段中。
main.c
1234567891011121314151617181920212223 | int globalVar1 = 36;//这2个变量声明在函数之外,是全局变量。有初值,因此在.data段int globalVar2[100];//没有初值,存在.bss段 int main(int argc, char *argc[])//int argc, char *argc[]这2个是参数,存在.stack段{ int n;//n是局部变量,保存在栈中 scanf("%d",&n); int *pBuffer = (int*)malloc(sizeof(int) * n);//malloc分配的,存在.heap中 for(int i=0;i<n;i++)//i是局部变量,保存在栈中 { pBuffer[i] = GetNextSquare(); } for(int i=0;i<n;i++)//i是局部变量,保存在栈中 { printf("%d,",pBuffer[i]); } return 0;} |
my_file.c
1234567891011121314 | static int staticGlobalVar1 = 100;//静态全局变量,有初值,保存在.data段中 static int Square(int input)//input参数,存在.stack段{ return input * input;} int GetNextSquare(){ static int num = 1;//这是静态局部变量,有初值,因此保存在.data段 int ret = Square(num); num++; return ret;} |
上方的程序,各个段的长度为:
| 变量 | 总大小 | |
|---|---|---|
| .data | int globalVar1(4) static int staticGlobalVar1(4) static int num(4) | 12 |
| .bss | int globalVar2[100](400) | 400 |
| .heap | malloc(sizeof(int) * n) | 512 |
| .stack | int n(4) int i(4) int input(4) int ret(4) | 1024 |
编译结果:
| text | data | bss | dec | hex |
|---|---|---|---|---|
| 5408 | 12 | 1644 | 7064 | 1b98 |
| 存储在Flash中的代码 | .data段 | .bss+.heap+.stack段 | 总和 十进制 | 总和 十六进制 |