导言
如上所示,Keil创建一段NoInit内存同样是通过图形界面来完成,IRAM2的起始地址0x2000000,大小8bytes。
NoInit的意思是程序初始化时,不会将内存清0初始化。
如上所示,在MEMORY段,将64K的RAM内存划一块8bytes的内存出来,重新命名为RAM_NOINIT。
MEMORY
{RAM (rw) : ORIGIN = 0x20000008, LENGTH = 64K - 8RAM_NOINIT (rw) : ORIGIN = 0x20000000, LENGTH = 8 FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
}
MEMORY的作用:
- 定义MCU的物理内存区域;
- 指定每个区域的起始地址和大小;
- 告诉链接器哪些地址范围是可用的;
RAM_NOINIT
只是一个命名的内存区域,本身没有no-init属性;
SECTIONS段的作用:(NOLOAD)
:这才是真正的no-init属性,告诉链接器不要为这个段生成初始化代码;*(.noinit)
:收集所有标记为.noinit段的变量;>RAM_NOINIT
:将这个段放置到之前定义的RAM_NOINIT
内存区域
一、在.noinit段声明一个变量
volatile uint64_t update_flag __attribute__((section(".noinit")));
如上所示,RAM_NOINIT内存被占满了。
如上所示,在.map文件中确认变量update_flag被定义在0x20000000。