有些時候在我們的應用過程中要求變量有連續性,或者現場保留,例如 Bootloader 跳轉,某種原因的復位過程中我們有些關鍵變量不能被初始化,在不同的編譯環境下有不同的設置,本文就這個操作做總結,分別介紹使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片為:STM32G431RBT6。Keil 中沒有這個關鍵字,而且會有版本的區別,下面分別介紹:
為了防止未初始化的變量被初始化為0,要將未初始化的變量放在一個特殊段內,這個段滿足是ZI數據段(.bss),它的執行域(region)具有UNINIT屬性。
修改工程的linkerfile文件,*.sct文件
這邊將RAM劃分兩個區間,其中RW_IRAM2就是我們要的變量不初始化區域,屬性為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 也是有區別的,不再支持 zero_init 這個修飾,如下定義:
uint16_tTest_NoInit__attribute__((section(".bss.NO_INIT")));//WorkforAC6
對于版本 AC5 和 AC6 具體區別可以參考 Keil 幫助文件中的描述:
-
keil
+關注
關注
68文章
1213瀏覽量
166875 -
變量
+關注
關注
0文章
613瀏覽量
28368 -
初始化
+關注
關注
0文章
50瀏覽量
11855
發布評論請先 登錄
相關推薦
評論