变量在SARM里的分布

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
#include <stdio.h>#include <stdlib.h>#include "my_file.h" 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;}

上方的程序,各个段的长度为:

变量总大小
.dataint globalVar1(4)
static int staticGlobalVar1(4)
static int num(4)
12
.bssint globalVar2[100](400)400
.heapmalloc(sizeof(int) * n)512
.stackint n(4)
int i(4)
int input(4)
int ret(4)
1024

编译结果:

textdatabssdechex
540812164470641b98
存储在Flash中的代码.data段.bss+.heap+.stack段总和
十进制
总和
十六进制
🔍 ×