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

為了驗證是否執(zhí)行成功,可以考慮周期性讓系統(tǒng)復位,看變量的變化,比如下面的示例程序讓系統(tǒng)周期復位,會發(fā)現(xiàn)每次 Test_NoInit 數(shù)據(jù)都是在上次數(shù)據(jù)基礎(chǔ)上增加 10,而不是被初始化后的數(shù)據(jù)增加 10。

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

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

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


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

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

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

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

圖4.劃分 RAM 區(qū)域
增加區(qū)域描述,并且加入?yún)^(qū)域名字:

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

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

原文標題:實戰(zhàn)經(jīng)驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信公眾號:STM32單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
單片機
+關(guān)注
關(guān)注
6071文章
45265瀏覽量
660750 -
STM32
+關(guān)注
關(guān)注
2301文章
11084瀏覽量
369786
原文標題:實戰(zhàn)經(jīng)驗 | Keil、IAR、CubeIDE 中變量不被初始化方法
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何在RTT Studio中像Keil中一樣定義一個RAM區(qū)域,并該區(qū)域RAM上電復位是不會被初始化的(sct分散加載)?
Linux服務器性能調(diào)優(yōu)的核心技巧和實戰(zhàn)經(jīng)驗
GraniStudio:IO初始化以及IO資源配置例程

GraniStudio:初始化例程

定義IO初始化結(jié)構(gòu)體
IM 系列設(shè)備過載保護機制下界面初始化中斷的底層邏輯與解決方案
使用jlink連接mcu查看日志,偶發(fā)重新初始化,部分線程未退出,變量錯位怎么解決?
EE-88:使用21xx編譯器在C中初始化變量

提升開關(guān)電源效率的理論分析與實戰(zhàn)經(jīng)驗

OMAP5912多媒體處理器初始化參考指南

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

評論