
關鍵詞:不被初始化,編譯環境
目錄預覽
1、前言
2、IAR 實現變量不初始化方法
3、Keil 實現變量不被初始化方法
4、CubeIDE 實現變量不初始化方法
01
前言
有些時候在我們的應用過程中要求變量有連續性,或者現場保留,例如 Bootloader 跳轉,某種原因的復位過程中我們有些關鍵變量不能被初始化,在不同的編譯環境下有不同的設置,本文就這個操作做總結,分別介紹使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片為STM32G431RBT6。
02
IAR 實現變量不初始化方法
IAR 實現相對簡單,直接使用“__no_init”這個關鍵字即可,也就是在變量前面進行修飾:

為了驗證是否執行成功,可以考慮周期性讓系統復位,看變量的變化,比如下面的示例程序讓系統周期復位,會發現每次 Test_NoInit 數據都是在上次數據基礎上增加 10,而不是被初始化后的數據增加 10。

03
Keil 實現變量不被初始化方法
Keil 中沒有像 IAR 里面的這個關鍵字,而且會有版本的區別,下面分別介紹:

圖1.Keil 不同編譯版本
為了防止未初始化的變量被初始化為 0,要將未初始化的變量放在一個特殊段內,這個段滿足是 ZI 數據段(.bss),它的執行域(region)具有 UNINIT 屬性。
修改工程的 linker file 文件,*.sct 文件

圖2.修改默認 linker file
這邊將 RAM 劃分兩個區間,其中 RW_IRAM2 就是我們要的變量不初始化區域,屬性為UNINIT,定義一個 region 名字 NO_INIT.


3.2. Arm Compiler 6 的操作
在 AC6 上面需要加入.bss 這個 ZI 定義,如下的 sct 文件修改:

變量定義到 section 部分,AC5 和 AC6 也是有區別的,不再支持 zero_init 這個修飾,如下定義:

對于版本 AC5 和 AC6 具體區別可以參考 Keil 幫助文件中的描述:

圖3.Keil 幫助文件關于 zero initialized
04
CubeIDE 實現變量不初始化方法
CubeIDE 的實現和 Keil 有類似的操作,需要修改 linker file 文件*.ld。首先對 RAM 進行劃分,劃分出不初始化的 RAM 區域:

圖4.劃分 RAM 區域
增加區域描述,并且加入區域名字:

圖5.區域描述,名字定義
定義變量到這個不初始化區域中:

另外,還提醒一點,有些 STM32 系列有專門針對特定 RAM 區復位后是否會被初始化的 Option 配置位。比方 STM32L4 系列,想讓 SRAM2 變量不被初始化,得配置選項字節中的 SRAM2_RST位。如下圖所示:

原文標題:實戰經驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
-
單片機
+關注
關注
6043文章
44622瀏覽量
638529 -
STM32
+關注
關注
2272文章
10923瀏覽量
357555
原文標題:實戰經驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
提升開關電源效率的理論分析與實戰經驗

STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

segger編譯器初始化問題
視頻引擎初始化失敗怎么回事
在初始化IO口為外部中斷線的時候,最先初始化的會被后初始化的覆蓋掉為什么?
STM32CubeIDE+FreeRtos+LWIP初始化不通過怎么解決?
STM32F103RC變量初始化問題求解
使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失敗的原因?怎么解決?
MCU單片機GPIO初始化該按什么順序配置?為什么初始化時有電平跳變?

評論