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

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ǔ)言中常見的修飾符:

1.static靜態(tài)修飾符:修飾變量,函數(shù)。作用域:變量?jī)H僅在本文件可見,函數(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等。

了解了修飾符之后,看見本文標(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è)資源沒有進(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集成開發(fā)環(huán)境下,這個(gè)修飾符有所不同;Keil中不集成這個(gè)修飾符,需要配置; 而IAR中集成這個(gè)修飾符,可直接使用。

Keil中__no_init的配置和使用

在Keil中,__no_init不是集成在開發(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ì)明白為什么沒有初始化的變量“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

    文章

    20250

    瀏覽量

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145565
  • static
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

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

    關(guān)注

    0

    文章

    52

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    ESP32-S3初始化攝像頭時(shí)檢測(cè)到攝像頭模組型號(hào)不被支持

    你現(xiàn)在遇到的核心問(wèn)題是:ESP32-S3初始化攝像頭時(shí)檢測(cè)到攝像頭模組型號(hào)不被支持(錯(cuò)誤碼0x106(ESP_ERR_NOT_SUPPORTED)),導(dǎo)致攝像頭探測(cè)失敗并觸發(fā)設(shè)備重啟。這個(gè)錯(cuò)誤
    發(fā)表于 02-11 06:38

    PC強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制():C#的EtherCAT總線初始化(下)

    通過(guò)使用配置工具導(dǎo)出ZAR文件進(jìn)行EtherCAT總線初始化
    的頭像 發(fā)表于 02-05 10:00 ?918次閱讀
    PC強(qiáng)實(shí)時(shí)運(yùn)動(dòng)控制(<b class='flag-5'>一</b>):C#的EtherCAT總線<b class='flag-5'>初始化</b>(下)

    volatile的修飾符

    register修飾符暗示編譯程序相應(yīng)的變量將被頻繁地使用,如果可能的話,應(yīng)將其保存在CPU的寄存中,以加快其存儲(chǔ)速度。 * Procedure for the assignment
    發(fā)表于 01-06 07:39

    EtherCAT總線初始化步驟

    EtherCAT(Ethernet for Control Automation Technology)是一種高性能的工業(yè)以太網(wǎng)通信協(xié)議,廣泛應(yīng)用于工業(yè)自動(dòng)領(lǐng)域。其初始化過(guò)程是確保系統(tǒng)穩(wěn)定運(yùn)行
    的頭像 發(fā)表于 12-22 10:10 ?575次閱讀
    EtherCAT總線<b class='flag-5'>初始化</b>步驟

    什么是??volatile

    volatile是個(gè)類型修飾符(type specifier)。 volatile的作用是作為指令關(guān)鍵字,確保本條指令不會(huì)因編譯的優(yōu)化省略,且要求每次直接讀值。 volatil
    發(fā)表于 11-25 06:36

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

    的RTU通信搭建牢固無(wú)憂。 、MODBUS 概述 Modbus 是一種廣泛應(yīng)用于工業(yè)自動(dòng)領(lǐng)域的串行通信協(xié)議,由 Modicon 公司(現(xiàn)為施耐德電氣旗下)于 1979 年推出,主要用于可編程邏輯控制
    的頭像 發(fā)表于 10-28 16:33 ?1653次閱讀
    串口通信基石:Air8000下Modbus RTU串口<b class='flag-5'>初始化</b>詳解!

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)33:初始化功能驗(yàn)證與分析

    本文主要交流NVMe設(shè)計(jì)思路,本博客已給出相關(guān)博文五十多篇,希望對(duì)初學(xué)者有定作用 初始化功能主要實(shí)現(xiàn) PCIe 鏈路設(shè)備的初始化配置和 NVMe
    發(fā)表于 10-08 08:02

    如何保持SRAM的狀態(tài),并在芯片復(fù)位時(shí)不初始化

    如何保持SRAM的狀態(tài),并在芯片復(fù)位時(shí)不初始化
    發(fā)表于 08-25 06:09

    GraniStudio:初始化例程

    說(shuō)明 通過(guò)初始化運(yùn)控板卡算子連接格拉尼總線型運(yùn)控卡,導(dǎo)入工程自動(dòng)進(jìn)行連接,此算子為使用運(yùn)控控制板卡的第項(xiàng)操作,后續(xù)運(yùn)控算子需引用其輸出板卡對(duì)象才可使用。 3.異常處理 當(dāng)手動(dòng)執(zhí)行初始化
    的頭像 發(fā)表于 08-22 16:45 ?891次閱讀
    GraniStudio:<b class='flag-5'>初始化</b>例程

    如何保持SRAM的狀態(tài)并在芯片復(fù)位時(shí)不初始化

    如何保持SRAM的狀態(tài),并在芯片復(fù)位時(shí)不初始化
    發(fā)表于 08-21 07:17

    定義IO初始化結(jié)構(gòu)體

    由上述IOPORT相關(guān)功能的枚舉類型我們可以知道,在對(duì)IOPORT模塊進(jìn)行初始化時(shí)需要根據(jù)情況配置它們。因此我們定義個(gè)IOPORT初始化的結(jié)構(gòu)體類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的
    的頭像 發(fā)表于 07-16 16:26 ?1407次閱讀

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之十:NVMe初始化狀態(tài)機(jī)設(shè)計(jì)

    設(shè)備控制可以正常處理指令,然后跳轉(zhuǎn)到DONE狀態(tài)。 DONE:NVMe配置初始化完成狀態(tài),該狀態(tài)表示NVMe配置初始化過(guò)程正常完成,當(dāng)復(fù)位
    發(fā)表于 07-05 22:03

    NVMe高速傳輸之?dāng)[脫XDMA設(shè)計(jì)之七:系統(tǒng)初始化

    系統(tǒng)復(fù)位退出后 1 秒時(shí)如果 LinkUp 信號(hào)仍為低電平, 則斷言為鏈路訓(xùn)練失敗, 初始化流程終止。 如果 LinkUp 為高電平, 此時(shí)用戶可通過(guò)系統(tǒng)控制模塊啟動(dòng) PCIe 初始化
    發(fā)表于 07-04 09:14

    IM 系列設(shè)備過(guò)載保護(hù)機(jī)制下界面初始化中斷的底層邏輯與解決方案

    、過(guò)載保護(hù)機(jī)制與界面初始化的關(guān)聯(lián)基礎(chǔ) IM 系列設(shè)備的過(guò)載保護(hù)機(jī)制是保障設(shè)備安全運(yùn)行的核心功能,其通過(guò)傳感實(shí)時(shí)采集設(shè)備運(yùn)行參數(shù),如電流、電壓、溫度、系統(tǒng)資源占用率等。旦這些參數(shù)超
    的頭像 發(fā)表于 06-27 09:58 ?540次閱讀

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

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