在网上看到关于MCU的一段资料,想问问看这对于我们用的芯片适用吗?
嵌入式MCU的片内RAM一般会被链接文件“分区”为如下几个段(section): .bss:未初始化段,MCU启动 (boot/startup)过程中会将该RAM区初始化为0; .data:数据段,该RAM区存放初始化值不为0的全局变量,其初始化值放置在编译结果的.copy(Flash/EEPROM)数据区,每次MCU启动(boot/startup)时,会将其初始值取出对.data区进行初始化; .stack:栈段,该地址空间的大小在C工程的链接文件中给出,CPU会自动保留该区域,不对其进行任何初始化,但在进入C语言main () 函数之前必须将.stack的起始地址 (stack的最小地址或者最高地址,也称为栈顶—stack top,具体取决于该CPU架构的栈生长方式) 赋值给CPU的栈指针寄存器SP (stack pointer) ,该过程也被称为堆栈初始化; .heap:堆段,该地址空间的大小在C工程的链接文件中给出,CPU会自动保留该区域,并初始化用于堆管理的指针链表;因为嵌入式MCU的片上RAM资源都非常小,是十分宝贵的资源,而使用heap对RAM空间进行动态管理效率极低,所以在嵌入式编程中极少使用heap,默认的嵌入式MCU C语言应用工程中是没有.heap段的; 常见的嵌入式C语言应用工程各数据段、代码段和堆栈的分配如下图所示: 其中放在Flash/EEPROM等NVM(Non-VolatileMemory—非易失性存储器)中的默认段包括: .text: 代码段,用于存放C应用工程中所有C函数代码的编译结果,比如启动函数startup,main函数等; .copy:拷贝段,用于存放.data段的初始化值; .const:常量段,用于存放工程中使用const修饰定义或者#define定义的常量; interrupt vector table:中断向量表,用于存放包含默认复位向量在内的内核CPU异常和外设中断向量表,其为内核CPU异常或者外设中断的中断服务函数ISR地址数组;
|