在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機變量不被初始化的實現(xiàn)方法

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2023-05-11 09:29 ? 次閱讀

最近有讀者問了一個這樣的問題:看門狗復位之后,能不能保持復位之前的狀態(tài)?

這種問題,或者類似的問題,相信很多小伙伴都經(jīng)歷過,特別是有多年單片機開發(fā)經(jīng)驗的小伙伴,而且現(xiàn)實中的很多項目確實有這樣的需求。

實現(xiàn)的方法有很多種,這里給大家講講在Keil、 IAR編譯環(huán)境下,單片機變量不被初始化的實現(xiàn)方法。

處理器復位

處理器復位的方式有很多種,這里結(jié)合STM來講述MCU復位的來源:

STM32的復位為三類:系統(tǒng)復位、電源復位和后備域復位

系統(tǒng)復位:

1. NRST引腳上的低電平(外部復位)

2. 窗口看門狗計數(shù)終止(WWDG復位)

3. 獨立看門狗計數(shù)終止(IWDG復位)

4. 軟件復位(SW復位)

5. 低功耗管理復位

電源復位:

1. 上電/掉電復位(POR/PDR復位)

2. 從待機模式中返回

備份區(qū)域復位:

1. 軟件復位,備份區(qū)域復位可由設置備份域控制寄存器(RCC_BDCR)中的BDRST位產(chǎn)生。

2. 在VDD和VBAT兩者掉電的前提下, VDD或VBAT上電將引發(fā)備份區(qū)域復位。

修飾符

實現(xiàn)處理器復位而變量不被初始化方法之前,讓我們先了解一下修飾符的知識。

修飾符是用于限定類型以及類型成員申明的一種符號。如C語言中常見的修飾符:

1.static靜態(tài)修飾符:修飾變量,函數(shù)。作用域:變量僅僅在本文件可見,函數(shù)在本文件可以被調(diào)用;

2.extern聲明修飾符:修飾變量,函數(shù)。修飾變量時候,變量的聲明在外面;

3.const常量修飾符:修飾變量,函數(shù)。修飾變量時候,不能被重復賦值,只能放在只讀段中;

4.volatile不穩(wěn)定變量修飾符:這個變量不好翻譯,在c中的作用大概有兩點意思:A.表示變量是易失的,易變的; B.強制訪存操作,防止編譯器去優(yōu)化,告訴編譯器每次必須去內(nèi)存中取值,而不是從寄存器或者緩存。
其實,在C++ JAVA中還有更多:

public公共訪問修飾符、private私有訪問修飾符、protected保護訪問修飾符、friendly、abstract等。

而本文會使用到一個修飾符:

__no_init
雖然這個修飾符不是C語言標準的修飾符,但在Keil、IAR這種集成開發(fā)環(huán)境中,他們支持這種修飾符。

而本文說的修飾符,修飾的變量位于RAM中:

在默認情況下,編譯器會將其變量存放在主RAM中,并在啟動時對其進行初始化。而__no_init類型修飾符使編譯器把變量放在非易失RAM區(qū)中,在啟動時也不對它們進行初始化,也就是說__no_init在系統(tǒng)啟動時不初始化變量。

Keil中__no_init的配置和使用

在Keil中,__no_init不是標準的修飾符,需要進行配置,配置之后就可以使用了。

1.宏定義__no_init

#define __no_init __attribute__((zero_init))

2.在工程選項中配置__no_init

Project -> Options for Targets -> Target,里面右下有個NoInit,這個就是需要我們配置的區(qū)域(可設定某一區(qū)域);


3f6b8b62-ef92-11ed-90ce-dac502259ad0.png ?

3.使用方法

比如定義變量:Cnt_NoInit
__no_init uint16_t Cnt_NoInit;

提示:不能初始化這個變量(也就是定義時不要賦值)。

IAR中中使用__no_init

在IAR中“__no_init”屬于是一個關(guān)鍵字,你會發(fā)現(xiàn)在使用這個修飾符之后,字體都是關(guān)鍵字顏色。
直接使用即可,類似上面定義一個不被初始化的變量:

__no_init uint16_t Cnt_NoInit;
參考源碼

這里給大家分享兩個簡單的Demo(源碼),Keil和IAR工程實現(xiàn)的功能一樣。

源代碼:

__no_inituint16_t Cnt_NoInit;
uint16_t Cnt_Init = 100;


int main(void)
{
  System_Initializes();
  printf("Start...
");  //復位打印


  while(1)
  {
    printf("Cnt_NoInit = %d
", Cnt_NoInit);   //打印變量
    Cnt_NoInit++;


    if(Cnt_NoInit > 1000)
    {
      Cnt_NoInit = 0;
    }


    printf("Cnt_Init = %d
", Cnt_Init);
    Cnt_Init++;
    if(Cnt_Init > 1000)
    {
      Cnt_Init = 0;
    }


    LED_ON;  
    TIMDelay_Nms(500);
    LED_OFF;
    TIMDelay_Nms(500);
    NVIC_SystemReset(); //系統(tǒng)復位
  }
}
被Cnt_NoInit修飾,則會打印如下消息:
Start...
Cnt_NoInit = 0
Cnt_Init = 100


Start...
Cnt_NoInit = 1
Cnt_Init = 100


Start...
Cnt_NoInit = 2
Cnt_Init = 100


Start...
Cnt_NoInit = 3
Cnt_Init=100
如果不被修飾:
uint16_t Cnt_NoInit;
uint16_t Cnt_Init = 100;
如果不被修飾:則會打印如下消息:
Start...
Cnt_NoInit = 0
Cnt_Init = 100


Start...
Cnt_NoInit = 0
Cnt_Init = 100


Start...
Cnt_NoInit = 0
Cnt_Init = 100


Start...
Cnt_NoInit = 0
Cnt_Init = 100
相信聰明的你,看了上面例子會明白為什么沒有初始化的變量“Cnt_NoInit”在變化,而初始化了的“Cnt_Init”一直不變。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6063

    文章

    44929

    瀏覽量

    647214
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17853

    瀏覽量

    360735
  • 看門狗
    +關(guān)注

    關(guān)注

    10

    文章

    579

    瀏覽量

    71579
  • IAR
    IAR
    +關(guān)注

    關(guān)注

    5

    文章

    370

    瀏覽量

    37264
  • 初始化
    +關(guān)注

    關(guān)注

    0

    文章

    50

    瀏覽量

    12057

原文標題:單片機變量不被初始化的實現(xiàn)方法

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    使用jlink連接mcu查看日志,偶發(fā)重新初始化,部分線程未退出,變量錯位怎么解決?

    使用jlink連接mcu查看日志,偶發(fā)重新初始化,部分線程未退出,變量錯位。 串口1的線程是在main最后面。 未見初始化打印,就已經(jīng)發(fā)送數(shù)據(jù)了。并且發(fā)送的數(shù)據(jù)不對。感覺是重新初始化
    發(fā)表于 03-07 07:19

    STM32CubeMX用于STM32配置和初始化C代碼生成

    電子發(fā)燒友網(wǎng)站提供《STM32CubeMX用于STM32配置和初始化C代碼生成.pdf》資料免費下載
    發(fā)表于 02-26 17:32 ?658次下載

    EE-359:ADSP-CM40x啟動時間優(yōu)化和器件初始化

    電子發(fā)燒友網(wǎng)站提供《EE-359:ADSP-CM40x啟動時間優(yōu)化和器件初始化.pdf》資料免費下載
    發(fā)表于 01-13 16:33 ?0次下載
    EE-359:ADSP-CM40x啟動時間優(yōu)化和器件<b class='flag-5'>初始化</b>

    EE-88:使用21xx編譯器在C中初始化變量

    電子發(fā)燒友網(wǎng)站提供《EE-88:使用21xx編譯器在C中初始化變量.pdf》資料免費下載
    發(fā)表于 01-13 15:54 ?0次下載
    EE-88:使用21xx編譯器在C中<b class='flag-5'>初始化</b><b class='flag-5'>變量</b>

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

    電子發(fā)燒友網(wǎng)站提供《OMAP5912多媒體處理器初始化參考指南.pdf》資料免費下載
    發(fā)表于 12-17 16:20 ?0次下載
    OMAP5912多媒體處理器<b class='flag-5'>初始化</b>參考指南

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

    STM32F407微控制器單元(MCU)與SD NAND的結(jié)合提供了強大的存儲解決方案。然而,不斷電初始化失效問題可能會導致系統(tǒng)穩(wěn)定性和數(shù)據(jù)完整性受損。我們將STM32F407與SD NAND集成時可能遇到的初始化問題,并提供專業(yè)的解決方案。
    的頭像 發(fā)表于 12-11 10:51 ?830次閱讀
    STM32F407 MCU使用SD NAND?不斷電<b class='flag-5'>初始化</b>失效解決方案

    segger編譯器初始化問題

    的圖; 2.第二張圖是該變量在文件中的所有操作,第一行是初始化,該行代碼在初始化部分最后一個,執(zhí)行完就是主循環(huán)了; 3.第2,3行也是對變量的賦值,在主循環(huán)中; 4.第4行已注釋; 5
    發(fā)表于 12-09 18:06

    ADS1299 FPGA驅(qū)動,是否成功實現(xiàn)了?應該如何初始化呢?

    關(guān)于FPGA驅(qū)動,是否成功實現(xiàn)了?應該如何初始化呢。急急急!
    發(fā)表于 11-22 09:25

    基于旋轉(zhuǎn)平移解耦框架的視覺慣性初始化方法

    精確和魯棒的初始化對于視覺慣性里程計(VIO)至關(guān)重要,因為不良的初始化會嚴重降低姿態(tài)精度。
    的頭像 發(fā)表于 11-01 10:16 ?859次閱讀
    基于旋轉(zhuǎn)平移解耦框架的視覺慣性<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    TMS320C6000 McBSP初始化

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000 McBSP初始化.pdf》資料免費下載
    發(fā)表于 10-26 10:10 ?0次下載
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    如何在i.MX RT微控制器上初始化LWIP協(xié)議棧

    在i.MX RT微控制器上初始化LWIP協(xié)議棧是一個復雜但有趣的過程,它涉及多個步驟和關(guān)鍵組件的配置.
    的頭像 發(fā)表于 10-12 11:48 ?713次閱讀
    如何在i.MX RT微控制器上<b class='flag-5'>初始化</b>LWIP協(xié)議棧

    視頻引擎初始化失敗怎么回事

    視頻引擎初始化失敗是一個常見的技術(shù)問題,它可能由多種原因引起,包括軟件沖突、硬件問題、驅(qū)動程序問題、系統(tǒng)設置錯誤等。要解決這個問題,需要對可能的原因進行詳細的分析和診斷。 1. 軟件沖突 1.1
    的頭像 發(fā)表于 09-18 18:18 ?2594次閱讀

    Keil中變量不被初始化方法

    有些時候在我們的應用過程中要求變量有連續(xù)性,或者現(xiàn)場保留,例如Bootloader跳轉(zhuǎn),某種原因的復位過程中我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設置,本文就這個操作做總結(jié),分別
    的頭像 發(fā)表于 08-30 11:47 ?1323次閱讀
    Keil中<b class='flag-5'>變量</b><b class='flag-5'>不被</b><b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    51系列單片機復位的作用是什么

    51系列單片機是一種廣泛應用的微控制器,其復位功能對于系統(tǒng)的穩(wěn)定運行至關(guān)重要。 一、51系列單片機復位的作用 系統(tǒng)初始化 當51系列單片機上電或復位時,系統(tǒng)需要進行
    的頭像 發(fā)表于 08-06 10:53 ?1528次閱讀

    瀚海微SD NAND應用之SD協(xié)議存儲功能描述2 初始化命令

    初始化和識別過程: 總線激活后,主機啟動卡初始化和識別過程。 初始化過程從SD SEND OP COND (ACMD41)開始,通過設置其操作條件和OCR中的HCS位。HCS (Host
    的頭像 發(fā)表于 07-22 10:54 ?670次閱讀
    瀚海微SD NAND應用之SD協(xié)議存儲功能描述2 <b class='flag-5'>初始化</b>命令
    主站蜘蛛池模板: 在线免费看一级片 | 丁香花在线电影小说观看 | 久久精品国波多野结衣 | 婷婷色爱区综合五月激情韩国 | 色婷婷色综合缴情在线 | 三级特黄视频 | 无遮挡很爽很污很黄的网站w | 337p亚洲精品色噜噜狠狠 | 美女扒开尿口给男人看的让 | 69日本xxxxxxxxx19| 四虎永久影院永久影库 | 人人澡人人澡碰人人看软件 | 新版天堂中文网 | 国产香蕉一区二区精品视频 | 亚洲久优优色优在线播放 | 五月婷婷视频在线 | 亚洲免费在线观看视频 | 爱逼综合 | 在线91精品亚洲网站精品成人 | 国产美女亚洲精品久久久综合 | 99久久久免费精品免费 | 嘿嘿嘿视频在线观看网站 | 久久福利青草精品资源站免费 | 男人的天堂天堂网 | 久久国产热| 久青草免费视频手机在线观看 | 粉嫩尤物在线456 | 国产区亚洲区 | 日本高清中文字幕在线观穿线视频 | 特级毛片永久久免费观看 | aaaaa毛片| 国产你懂的视频 | 高清欧美日本视频免费观看 | 天天射天天做 | 五月婷婷六月综合 | 久久综合色视频 | 成年在线视频 | 一级毛片免费在线观看网站 | 拍拍拍交性免费视频 | 香港澳门a级三级三级全黄 香港经典a毛片免费观看爽爽影院 | 久久99精品福利久久久 |