導言
如上所示,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。