91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

一種修飾符能使變量在處理器復位而不被初始化

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 2020-03-14 15:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

先了解一下修飾符知識

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

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

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

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

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

C++ JAVA中還有更多:

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

了解了修飾符之后,看見本文標題就知道本文提供的那個修飾符對于變量來說是比較重要的。

之前寫過一篇文章【CM3(STM32)內核復位與系統復位區別及應用】,講述了系統和內核復位之后存在差異,其實主要就是說內核復位之后,芯片外設資源沒有進行復位的操作。

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

什么情況下使用這修飾符使系統禁止變量的初始化?

看門狗復位的現場恢復,如果初始化了就完全不可恢復了。

Keil和IAR集成開發環境下,這個修飾符有所不同;Keil中不集成這個修飾符,需要配置; 而IAR中集成這個修飾符,可直接使用。

Keil中__no_init的配置和使用

在Keil中,__no_init不是集成在開發環境中,故需要配置,配置之后就可以使用了。

1.宏定義__no_init

#define __no_init __attribute__((zero_init))

2.在工程選項中配置__no_init

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

3.使用方法

__no_init uint16_t Cnt_NoInit;

提示:不能初始化這個變量。

IAR中的__no_init

IAR中的“__no_init”是一個關鍵字,你會發現在使用這個修飾符之后,字體都是關鍵字顏色。

__no_init uint16_t Cnt_NoInit;

例程源代碼下載與說明

代碼下載地址:

http://pan.baidu.com/s/1hskScba

兩個工程名稱:

1.STM32F103ZE(Keil)_復位不初始化變量NoInit

2.STM32F103ZE(IAR)_復位不初始化變量NoInit

本文提供的例程是一個Demo比較簡單,但具有實際意義。Keil和IAR工程實現的功能一樣。

源代碼:

__no_inituint16_t Cnt_NoInit;

uint16_t Cnt_Init = 100;

intmain(void)

{

System_Initializes();

printf("Start...\n"); //復位打印

while(1)

{

printf("Cnt_NoInit = %d\n", Cnt_NoInit); //打印變量

Cnt_NoInit++;

if(Cnt_NoInit > 1000)

{

Cnt_NoInit = 0;

}

printf("Cnt_Init = %d\n", Cnt_Init);

Cnt_Init++;

if(Cnt_Init > 1000)

{

Cnt_Init = 0;

}

LED_ON;

TIMDelay_Nms(500);

LED_OFF;

TIMDelay_Nms(500);

NVIC_SystemReset(); //系統復位

}

}

不初始化變量,則會打印如下消息:

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

如果Cnt_NoInit不被修飾成不初始化

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”一直不變。

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

    關注

    68

    文章

    19890

    瀏覽量

    235128
  • C語言
    +關注

    關注

    180

    文章

    7632

    瀏覽量

    141677
  • static
    +關注

    關注

    0

    文章

    34

    瀏覽量

    10712
  • 初始化
    +關注

    關注

    0

    文章

    50

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    定義IO初始化結構體

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

    NVMe高速傳輸之擺脫XDMA設計之十:NVMe初始化狀態機設計

    設備控制可以正常處理指令,然后跳轉到DONE狀態。 DONE:NVMe配置初始化完成狀態,該狀態表示NVMe配置初始化過程正常完成,當復位
    發表于 07-05 22:03

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

    系統復位退出后 1 秒時如果 LinkUp 信號仍為低電平, 則斷言為鏈路訓練失敗, 初始化流程終止。 如果 LinkUp 為高電平, 此時用戶可通過系統控制模塊啟動 PCIe 初始化
    發表于 07-04 09:14

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

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

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

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

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

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

    segger編譯初始化問題

    的圖; 2.第二張圖是該變量文件中的所有操作,第行是初始化,該行代碼初始化部分最后
    發表于 12-09 18:06

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

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

    TMS320C6000 McBSP初始化

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

    復位電路介紹 復位電路的原理及作用

    電路概述 復位電路是一種用于控制電子系統啟動或恢復到初始狀態的電路。當系統通電或者按下復位按鈕時,復位電路會發送
    的頭像 發表于 10-18 16:44 ?7494次閱讀

    如何在i.MX RT微控制初始化LWIP協議棧

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

    Keil中變量不被初始化方法

    有些時候我們的應用過程中要求變量有連續性,或者現場保留,例如Bootloader跳轉,某種原因的復位過程中我們有些關鍵變量不能被初始化
    的頭像 發表于 08-30 11:47 ?1519次閱讀
    Keil中<b class='flag-5'>變量</b><b class='flag-5'>不被</b><b class='flag-5'>初始化</b>方法

    鴻蒙原生應用元服務開發-倉頡基本概念程序結構

    決定了變量初始化后其值還能否改變,倉頡變量也由此分為不可變變量和可變變量兩類。 可見性修飾符
    發表于 08-13 10:57

    DSP復位地址不在0x20b00000導致仿真時初始化失敗

    在對dsp仿真時,點擊systeam reset后,復位地址不在0x20b00000,出現這種現象后,使用XDS560仿真仿真程序的初始化就會出問題,初始化失敗,使用XDS100的仿
    發表于 08-12 09:56

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

    51系列單片機是一種廣泛應用的微控制,其復位功能對于系統的穩定運行至關重要。 、51系列單片機復位的作用 系統
    的頭像 發表于 08-06 10:53 ?1688次閱讀
    主站蜘蛛池模板: 婷婷久久五月天 | 午夜五月天 | caopon在线| 网www天堂资源在线 网红和老师啪啪对白清晰 网络色综合久久 | 久久天天躁狠狠躁夜夜爽蜜月 | 欧美亚洲h在线一区二区 | 亚洲国内精品 | 性欧美成人免费观看视 | 网站在线你懂的 | 男女免费在线视频 | 亚洲va久久久噜噜噜久久 | 天堂资源中文官网 | seetube18日本第一次 | 色婷婷影院在线视频免费播放 | 午夜影院免费体验 | 欧美综合天天夜夜久久 | 在线观看亚洲成人 | 午夜手机看片 | 欧美黄色大片免费观看 | 久久久久大香线焦 | 免费看你懂的 | 狠狠干b | 国产呦在线观看视频 | 男女免费网站 | 天天操天天干天天摸 | 久久婷婷婷 | 三级网址在线播放 | 久久国产精品亚洲综合 | 亚洲 欧美 另类 吹潮 | 88影视在线观看污污 | 午夜香港三级在线观看网 | 好大好硬好爽免费视频 | 男女午夜特黄毛片免费 | 69xxx网站| 看免费黄色大片 | 久久三级国产 | 黄网站色成年片大免费软件 | 完整日本特级毛片 | 无遮挡高清一级毛片免费 | 亚洲男人天堂网址 | 欧美就是色 |