1.引言
在单片机和嵌入式中,代码的程序和数据会存储在不同的地方,下面进行总结。
一般程序可以分为程序段和数据段,如果再分细一点,还可以分为text段、rodata段、data段和bss段
2.text段
text段就是程序部分,一般情况下存储在ROM中。
3.rodata段
rodata段,rodata全称是Read-oniy-data。即程序中定义为const的变量,以及诸如「"Hello World!"」的字符串。
一般情况下存储在ROM中。
l例如:
const int A = 4;
const char B[] = "This is a bool";
const int A[10] = {11,22,33,44,55,66,77,88,99,0};
void fun(void)
{
char *string = "rodata String";//属于rodata段
}
4.data段
有初值的全局变量都属于这个段。
在链接时期,这些初值必须加入可执行文件中;在执行时期,因为这些变量的值可能会改变,所以不能在ROM地址中寻址,即系统在开始使用这些变量之前,必须将其初值加载到RAM中。
所以,data段会被加入ROM中,但要到RAM的地址寻址。
例如:
int a = 10;
int b[10] = {11,22,33,44,55,66,77,88,99,0};
5.bss段
bas的全称是Block Started by Symbol。bss段即是没有初值的全局变量。
因为没有初值,所以不需要加入程序中,只要在链接的时候在RAM寻址即可。
例如:
int a;
char b[10];
int buffer[100*1024];
6.总结
段区名 | text段 | rodata段 | data段 | bss段 |
---|---|---|---|---|
包含内容 | 程序部分 | const变量和字符串 | 有初值的全局变量 | 没有初值的全局变量 |
存储位置 | ROM | ROM | ROM,但会加载到RAM | RAM |