一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-14 15:01 ? 次閱讀

先了解一下修飾符知識(shí)

修飾符是用于限定類型以及類型成員申明的一種符號(hào)。如C語(yǔ)言中常見(jiàn)的修飾符:

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

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

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

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

C++ JAVA中還有更多:

public公共訪問(wèn)修飾符、private私有訪問(wèn)修飾符、protected保護(hù)訪問(wèn)修飾符、friendly、abstract等。

了解了修飾符之后,看見(jiàn)本文標(biāo)題就知道本文提供的那個(gè)修飾符對(duì)于變量來(lái)說(shuō)是比較重要的。

之前寫過(guò)一篇文章【CM3(STM32)內(nèi)核復(fù)位與系統(tǒng)復(fù)位區(qū)別及應(yīng)用】,講述了系統(tǒng)和內(nèi)核復(fù)位之后存在差異,其實(shí)主要就是說(shuō)內(nèi)核復(fù)位之后,芯片外設(shè)資源沒(méi)有進(jìn)行復(fù)位的操作。

而本文說(shuō)的修飾符,修飾的變量位于RAM中,在默認(rèn)情況下,編譯器會(huì)將其變量存放在主RAM中,并在啟動(dòng)時(shí)對(duì)其進(jìn)行初始化。而本文說(shuō)的__no_init類型修飾符使編譯器把變量放在非易失RAM區(qū)中,在啟動(dòng)時(shí)也不對(duì)它們進(jìn)行初始化,也就是說(shuō)__no_init在系統(tǒng)啟動(dòng)時(shí)不初始化變量。

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

看門狗復(fù)位的現(xiàn)場(chǎng)恢復(fù),如果初始化了就完全不可恢復(fù)了。

Keil和IAR集成開(kāi)發(fā)環(huán)境下,這個(gè)修飾符有所不同;Keil中不集成這個(gè)修飾符,需要配置; 而IAR中集成這個(gè)修飾符,可直接使用。

Keil中__no_init的配置和使用

在Keil中,__no_init不是集成在開(kāi)發(fā)環(huán)境中,故需要配置,配置之后就可以使用了。

1.宏定義__no_init

#define __no_init __attribute__((zero_init))

2.在工程選項(xiàng)中配置__no_init

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

3.使用方法

__no_init uint16_t Cnt_NoInit;

提示:不能初始化這個(gè)變量。

IAR中的__no_init

IAR中的“__no_init”是一個(gè)關(guān)鍵字,你會(huì)發(fā)現(xiàn)在使用這個(gè)修飾符之后,字體都是關(guān)鍵字顏色。

__no_init uint16_t Cnt_NoInit;

例程源代碼下載與說(shuō)明

代碼下載地址:

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

兩個(gè)工程名稱:

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

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

本文提供的例程是一個(gè)Demo比較簡(jiǎn)單,但具有實(shí)際意義。Keil和IAR工程實(shí)現(xiàn)的功能一樣。

源代碼:

__no_inituint16_t Cnt_NoInit;

uint16_t Cnt_Init = 100;

intmain(void)

{

System_Initializes();

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

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(); //系統(tǒng)復(fù)位

}

}

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

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;

則會(huì)打印出如下信息

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

相信聰明的你,看了上面例子會(huì)明白為什么沒(méi)有初始化的變量“Cnt_NoInit”在變化,而初始化了的“Cnt_Init”一直不變。

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

    關(guān)注

    68

    文章

    19740

    瀏覽量

    232918
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139758
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

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

    關(guān)注

    0

    文章

    50

    瀏覽量

    12029
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    電子發(fā)燒友網(wǎng)站提供《EE-88:使用21xx編譯C中初始化變量.pdf》資料免費(fèi)下載
    發(fā)表于 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多媒體處理器初始化參考指南

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

    segger編譯初始化問(wèn)題

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

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

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

    TMS320C6000 McBSP初始化

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

    復(fù)位電路介紹 復(fù)位電路的原理及作用

    電路概述 復(fù)位電路是一種用于控制電子系統(tǒng)啟動(dòng)或恢復(fù)到初始狀態(tài)的電路。當(dāng)系統(tǒng)通電或者按下復(fù)位按鈕時(shí),復(fù)位電路會(huì)發(fā)送
    的頭像 發(fā)表于 10-18 16:44 ?6059次閱讀

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

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

    Keil中變量不被初始化方法

    有些時(shí)候我們的應(yīng)用過(guò)程中要求變量有連續(xù)性,或者現(xiàn)場(chǎng)保留,例如Bootloader跳轉(zhuǎn),某種原因的復(fù)位過(guò)程中我們有些關(guān)鍵變量不能被初始化
    的頭像 發(fā)表于 08-30 11:47 ?1176次閱讀
    Keil中<b class='flag-5'>變量</b><b class='flag-5'>不被</b><b class='flag-5'>初始化</b>方法

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-倉(cāng)頡基本概念程序結(jié)構(gòu)

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

    DSP復(fù)位地址不在0x20b00000導(dǎo)致仿真時(shí)初始化失敗

    在對(duì)dsp仿真時(shí),點(diǎn)擊systeam reset后,復(fù)位地址不在0x20b00000,出現(xiàn)這種現(xiàn)象后,使用XDS560仿真仿真程序的初始化就會(huì)出問(wèn)題,初始化失敗,使用XDS100的仿
    發(fā)表于 08-12 09:56

    51系列單片機(jī)復(fù)位的作用是什么

    51系列單片機(jī)是一種廣泛應(yīng)用的微控制,其復(fù)位功能對(duì)于系統(tǒng)的穩(wěn)定運(yùn)行至關(guān)重要。 、51系列單片機(jī)復(fù)位的作用 系統(tǒng)
    的頭像 發(fā)表于 08-06 10:53 ?1393次閱讀

    ESP32S2復(fù)位初始化的時(shí)最初的GPIO的狀態(tài)是什么樣的?

    麻煩咨詢下ESP32S2復(fù)位初始化的時(shí)最初的GPIO的狀態(tài)是什么樣的?是默認(rèn)輸入模式、還是默認(rèn)為輸出模式、還是默認(rèn)為高阻模式?如上圖的PCLK為
    發(fā)表于 07-01 08:07

    請(qǐng)問(wèn)ESP32C3復(fù)位初始化的時(shí)最初的GPIO的狀態(tài)是什么樣的?

    麻煩咨詢下ESP32C3復(fù)位初始化的時(shí)最初的GPIO的狀態(tài)是什么樣的?是默認(rèn)輸入模式、還是默認(rèn)為輸出模式、還是默認(rèn)為高阻模式?我看技術(shù)參考手冊(cè)的對(duì)應(yīng)部分,只顯示
    發(fā)表于 07-01 06:21

    初始化IO口為外部中斷線的時(shí)候,最先初始化的會(huì)被后初始化的覆蓋掉為什么?

    初始化IO口為外部中斷線的時(shí)候,比如GPIOA6與GPIOB6先后初始化為外部中斷,最先初始化的會(huì)被后初始化的覆蓋掉,不知道是為什么?
    發(fā)表于 05-14 08:26

    請(qǐng)問(wèn)STM8S207如何讓編譯stvd+cosmic復(fù)位后不給這個(gè)變量初始化成0?

    ,上電時(shí)開(kāi)始為0V,過(guò)會(huì)充滿電為VCC),上電標(biāo)志0則讀出EEPROM數(shù)據(jù),為1則為看門狗熱復(fù)位不讀EEPROM,變量value仍保持原數(shù)據(jù)繼續(xù)計(jì)數(shù)。 我沒(méi)有初始化但編譯
    發(fā)表于 05-09 08:01