![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnqAHE0yAAHUHXdxAL4084.gif)
關鍵詞:不被初始化,編譯環境
目錄預覽
1、前言
2、IAR 實現變量不初始化方法
3、Keil 實現變量不被初始化方法
4、CubeIDE 實現變量不初始化方法
01
前言
有些時候在我們的應用過程中要求變量有連續性,或者現場保留,例如 Bootloader 跳轉,某種原因的復位過程中我們有些關鍵變量不能被初始化,在不同的編譯環境下有不同的設置,本文就這個操作做總結,分別介紹使用 Keil,IAR 和 CubeIDE 的操作方法,本文中所用芯片為STM32G431RBT6。
02
IAR 實現變量不初始化方法
IAR 實現相對簡單,直接使用“__no_init”這個關鍵字即可,也就是在變量前面進行修飾:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnqASoJ1AAATsT9ecNw680.jpg)
為了驗證是否執行成功,可以考慮周期性讓系統復位,看變量的變化,比如下面的示例程序讓系統周期復位,會發現每次 Test_NoInit 數據都是在上次數據基礎上增加 10,而不是被初始化后的數據增加 10。
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnqAFMJLAAAfRR1W9tE546.jpg)
03
Keil 實現變量不被初始化方法
Keil 中沒有像 IAR 里面的這個關鍵字,而且會有版本的區別,下面分別介紹:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnuAYIx1AACKySLLwCM587.jpg)
圖1.Keil 不同編譯版本
為了防止未初始化的變量被初始化為 0,要將未初始化的變量放在一個特殊段內,這個段滿足是 ZI 數據段(.bss),它的執行域(region)具有 UNINIT 屬性。
修改工程的 linker file 文件,*.sct 文件
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnuAPkW_AAB45e8-j9k904.jpg)
圖2.修改默認 linker file
這邊將 RAM 劃分兩個區間,其中 RW_IRAM2 就是我們要的變量不初始化區域,屬性為UNINIT,定義一個 region 名字 NO_INIT.
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnuAaR3PAADT8px50cM464.jpg)
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnuABDR_AAApvzKh_-E728.jpg)
3.2. Arm Compiler 6 的操作
在 AC6 上面需要加入.bss 這個 ZI 定義,如下的 sct 文件修改:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnuAdvI7AAApToVrweY667.jpg)
變量定義到 section 部分,AC5 和 AC6 也是有區別的,不再支持 zero_init 這個修飾,如下定義:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyAMiL4AAAnrT211aE261.jpg)
對于版本 AC5 和 AC6 具體區別可以參考 Keil 幫助文件中的描述:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyAJtTpAADbDehrxb8534.jpg)
圖3.Keil 幫助文件關于 zero initialized
04
CubeIDE 實現變量不初始化方法
CubeIDE 的實現和 Keil 有類似的操作,需要修改 linker file 文件*.ld。首先對 RAM 進行劃分,劃分出不初始化的 RAM 區域:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyAAqBZAACw6lkYTbY506.jpg)
圖4.劃分 RAM 區域
增加區域描述,并且加入區域名字:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyAS3oYAADd1Ic2Mlw975.jpg)
圖5.區域描述,名字定義
定義變量到這個不初始化區域中:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyAVtRLAAAs2q3SZ1w111.jpg)
另外,還提醒一點,有些 STM32 系列有專門針對特定 RAM 區復位后是否會被初始化的 Option 配置位。比方 STM32L4 系列,想讓 SRAM2 變量不被初始化,得配置選項字節中的 SRAM2_RST位。如下圖所示:
![](https://file1.elecfans.com//web2/M00/B0/DF/wKgaomVgdnyARXCCAAB8XRML4og260.jpg)
原文標題:實戰經驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
-
單片機
+關注
關注
6043文章
44622瀏覽量
638529 -
STM32
+關注
關注
2272文章
10923瀏覽量
357555
原文標題:實戰經驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
提升開關電源效率的理論分析與實戰經驗
![提升開關電源效率的理論分析與<b class='flag-5'>實戰經驗</b>](https://file1.elecfans.com/web3/M00/05/55/wKgZPGd_LySAYShvAAAZtQjQtaA655.jpg)
STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案
![STM32F407 MCU使用SD NAND?不斷電<b class='flag-5'>初始化</b>失效解決方案](https://file1.elecfans.com/web3/M00/01/D6/wKgZPGdY_fiAfhvVAAES2FwC9UU093.png)
segger編譯器初始化問題
視頻引擎初始化失敗怎么回事
在初始化IO口為外部中斷線的時候,最先初始化的會被后初始化的覆蓋掉為什么?
STM32CubeIDE+FreeRtos+LWIP初始化不通過怎么解決?
STM32F103RC變量初始化問題求解
使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失敗的原因?怎么解決?
MCU單片機GPIO初始化該按什么順序配置?為什么初始化時有電平跳變?
![MCU單片機GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時有電平跳變?](https://file1.elecfans.com/web2/M00/C1/7A/wKgaomXWul2AKoIuAAAxlaP9tbg978.png)
評論