有些時候在我們的應(yīng)用過程中要求變量有連續(xù)性,或者現(xiàn)場保留,例如 Bootloader 跳轉(zhuǎn),某種原因的復(fù)位過程中我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個操作做總結(jié),分別介紹使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片為:STM32G431RBT6。Keil 中沒有這個關(guān)鍵字,而且會有版本的區(qū)別,下面分別介紹:
為了防止未初始化的變量被初始化為0,要將未初始化的變量放在一個特殊段內(nèi),這個段滿足是ZI數(shù)據(jù)段(.bss),它的執(zhí)行域(region)具有UNINIT屬性。
修改工程的linkerfile文件,*.sct文件
這邊將RAM劃分兩個區(qū)間,其中RW_IRAM2就是我們要的變量不初始化區(qū)域,屬性為UNINIT,定義一個region名字NO_INIT.
ER_IROM10x080000000x00020000{;loadaddress=executionaddress*.o(RESET,+First)*(InRoot$$Sections).ANY(+RO).ANY(+XO)} RW_IRAM10x200004000x00007C00{ ;RWdata .ANY(+RW+ZI) } RW_IRAM20x20000000UNINIT0x00000400 { .ANY(NO_INIT) }}
變量定義到這個 section,這邊 AC5 要用到 zero_init 這個修飾。
uint16_tTest_NoInit__attribute__((section("NO_INIT"),zero_init));//WorkforAC5
2. Arm Compiler 6 的操作
在 AC6 上面需要加入.bss 這個 ZI 定義,如下的 sct 文件修改:
RW_IRAM20x20000000UNINIT0x00000400{ .ANY (.bss.NO_INIT)}
變量定義到 section 部分,AC5 和 AC6 也是有區(qū)別的,不再支持 zero_init 這個修飾,如下定義:
uint16_tTest_NoInit__attribute__((section(".bss.NO_INIT")));//WorkforAC6
對于版本 AC5 和 AC6 具體區(qū)別可以參考 Keil 幫助文件中的描述:
-
keil
+關(guān)注
關(guān)注
68文章
1212瀏覽量
166838 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28360 -
初始化
+關(guān)注
關(guān)注
0文章
50瀏覽量
11850
發(fā)布評論請先 登錄
相關(guān)推薦
評論