国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

單片機變量不被初始化的實現方法

strongerHuang ? 來源:strongerHuang ? 作者:strongerHuang ? 2023-05-11 09:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

處理器復位

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

STM32的復位為三類:系統復位、電源復位和后備域復位

系統復位:

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

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

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

4. 軟件復位(SW復位)

5. 低功耗管理復位

電源復位:

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

2. 從待機模式中返回

備份區域復位:

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

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

修飾符

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

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

1.static靜態修飾符:修飾變量,函數。作用域:變量僅僅在本文件可見,函數在本文件可以被調用;

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

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

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

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

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

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

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

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

Keil中__no_init的配置和使用

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

1.宏定義__no_init

#define __no_init __attribute__((zero_init))

2.在工程選項中配置__no_init

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


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

3.使用方法

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

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

IAR中中使用__no_init

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

__no_init uint16_t Cnt_NoInit;
參考源碼

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

源代碼:

__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(); //系統復位
  }
}
被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”一直不變。

審核編輯:湯梓紅

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

    關注

    6076

    文章

    45495

    瀏覽量

    670407
  • mcu
    mcu
    +關注

    關注

    147

    文章

    18925

    瀏覽量

    398251
  • 看門狗
    +關注

    關注

    10

    文章

    610

    瀏覽量

    72959
  • IAR
    IAR
    +關注

    關注

    5

    文章

    410

    瀏覽量

    38548
  • 初始化
    +關注

    關注

    0

    文章

    52

    瀏覽量

    12372

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

文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    PC強實時運動控制(一):C#的EtherCAT總線初始化(下)

    通過使用配置工具導出ZAR文件進行EtherCAT總線初始化
    的頭像 發表于 02-05 10:00 ?971次閱讀
    PC強實時運動控制(一):C#的EtherCAT總線<b class='flag-5'>初始化</b>(下)

    國民技術發布N32Cube芯片配置與初始化代碼生成工具

    1月30日,國民技術(NSING)正式發布N32Cube——芯片配置與初始化代碼生成工具,讓時鐘、引腳與外設的配置一目了然、輕松上手!
    的頭像 發表于 02-02 15:26 ?550次閱讀
    國民技術發布N32Cube芯片配置與<b class='flag-5'>初始化</b>代碼生成工具

    MCU工程初始化,到底該不該交給工具?

    背景 工程初始化重復性高,但出錯成本大。工程師常問:交給工具是不是會丟失掌控? 工具可做的事 時鐘樹、引腳復用、外設配置 工程生成、代碼模板套用 參數校驗和約束檢查 工程師仍需做的事 特殊業務邏輯
    的頭像 發表于 01-29 10:18 ?145次閱讀
    MCU工程<b class='flag-5'>初始化</b>,到底該不該交給工具?

    EtherCAT總線初始化步驟

    EtherCAT(Ethernet for Control Automation Technology)是一種高性能的工業以太網通信協議,廣泛應用于工業自動領域。其初始化過程是確保系統穩定運行
    的頭像 發表于 12-22 10:10 ?590次閱讀
    EtherCAT總線<b class='flag-5'>初始化</b>步驟

    瀚海微SD NAND TF卡硬件識別與初始化類問題探討

    在瀚海微SD NAND/TF卡的實際應用中,硬件識別與初始化是保障設備正常運行的首要環節,該環節出現故障會直接導致存儲卡無法投入使用,尤其在工業控制、車載設備等關鍵場景中,可能引發設備停機、數據丟失
    的頭像 發表于 11-18 09:58 ?517次閱讀
    瀚海微SD NAND  TF卡硬件識別與<b class='flag-5'>初始化</b>類問題探討

    SD卡初始化原理講解與實現

    初始化過程: 在對 SD 卡初始化之前,我們需要對其上電后復位。復位的方法為: 1 拉高 CS,發送至少 74 個時鐘周期來使 SD 卡達到正常工作電壓和進行同步 2 選低 CS,發送 CMD0,需要
    發表于 10-29 06:33

    串口通信基石:Air8000下Modbus RTU串口初始化詳解!

    串口初始化是Modbus RTU通信穩定可靠的關鍵起點。本篇深入剖析Air8000開發板串口參數配置、初始化代碼實現及調試要點,結合master_rtu示例,分享實際操作中的經驗與避坑指南,讓您
    的頭像 發表于 10-28 16:33 ?1657次閱讀
    串口通信基石:Air8000下Modbus RTU串口<b class='flag-5'>初始化</b>詳解!

    NVMe高速傳輸之擺脫XDMA設計33:初始化功能驗證與分析

    本文主要交流NVMe設計思路,在本博客已給出相關博文五十多篇,希望對初學者有一定作用 初始化功能主要實現 PCIe 鏈路設備的初始化配置和 NVMe 初始化配置。 復雜的PCIe 事務
    發表于 10-08 08:02

    GraniStudio:IO初始化以及IO資源配置例程

    IO資源配置.gsp文件,點擊打開,完成導入。 2.功能說明 實現連接格拉尼控制器IO塊以及配置輸入輸出IO點。 2.1通過初始化IO算子連接格拉尼控制器IO塊,導入工程自動進行連接。 2.2 通過IO配置算子輸出配置的IO表。 第一次使用GS軟件時操作步驟如下: (1)
    的頭像 發表于 08-22 17:34 ?937次閱讀
    GraniStudio:IO<b class='flag-5'>初始化</b>以及IO資源配置例程

    GraniStudio:初始化例程

    1.文件運行 導入工程 雙擊運行桌面GraniStudio.exe。 通過引導界面導入初始化例程,點擊導入按鈕。 打開初始化例程所在路徑,選中初始化.gsp文件,點擊打開,完成導入。 2.功能
    的頭像 發表于 08-22 16:45 ?897次閱讀
    GraniStudio:<b class='flag-5'>初始化</b>例程

    MCU外設初始化:為什么參數配置必須優先于使能

    在微控制器領域,初始化參數配置階段至關重要。此時,雖無電源驅動,但微控制器在使能信號到來前,借初始化參數配置這一精細步驟,開啟關鍵準備進程。初始化參數配置如同物理坐標錨定、邏輯指令部署、內在秩序預設
    的頭像 發表于 08-13 10:38 ?791次閱讀

    定義IO初始化結構體

    由上述IOPORT相關功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據情況配置它們。因此我們定義一個IOPORT初始化的結構體類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的變量,因此
    的頭像 發表于 07-16 16:26 ?1413次閱讀

    NVMe高速傳輸之擺脫XDMA設計之七:系統初始化

    直接采用PCIe實現NVMe功能,它的系統初始化流程主要分為鏈路訓練、PCIe 初始化和 NVMe 初始化, 分別實現 PCIe鏈路連接、
    發表于 07-04 09:14

    IM 系列設備過載保護機制下界面初始化中斷的底層邏輯與解決方案

    一、過載保護機制與界面初始化的關聯基礎 IM 系列設備的過載保護機制是保障設備安全運行的核心功能,其通過傳感器實時采集設備運行參數,如電流、電壓、溫度、系統資源占用率等。一旦這些參數超出預設閾值
    的頭像 發表于 06-27 09:58 ?541次閱讀

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

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