一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲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)不再提示

一文詳解volatile關(guān)鍵字

CHANBAEK ? 來(lái)源:CSDN-借過(guò)風(fēng)景 ? 作者:CSDN-借過(guò)風(fēng)景 ? 2023-02-15 11:54 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1、volatile關(guān)鍵字

volatile 是易變的、不穩(wěn)定的意思。 和const一樣是一種類型修飾符,volatile關(guān)鍵字修飾的變量,編譯器對(duì)訪問(wèn)該變量的代碼不再進(jìn)行優(yōu)化,從而可以提供對(duì)特殊地址的穩(wěn)定訪問(wèn)。
以前只是聽(tīng)過(guò)這個(gè)關(guān)鍵詞,知道它的存在,但從來(lái)沒(méi)用過(guò)。 用此文記錄下在開(kāi)發(fā)RISC-V MCU過(guò)程中,未用volatile修飾標(biāo)志位變量,編譯器進(jìn)行優(yōu)化,導(dǎo)致程序運(yùn)行異常。

2、演示

開(kāi)發(fā)中,常見(jiàn)的需求,主循環(huán)中根據(jù)中斷中修改的標(biāo)志位,運(yùn)行不同的功能,

#include "debug.h"
 
uint8_t flag_interrupt = 0;
 
int main(void)
{
    USART_Printf_Init(115200);
    printf("SystemClk:%d\\r\\n",SystemCoreClock);
 
    EXTI0_INT_INIT();
 
    while(1)
    {
        if(flag_interrupt == 1)
        {
            flag_interrupt = 0;
            printf("do something\\r\\n");
        }
    }
}
 
/* 外部中斷服務(wù)函數(shù)*/
__attribute__((interrupt("WCH-Interrupt-fast")))
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0)==SET)  //EXTI_GetITStatus用來(lái)獲取中斷標(biāo)志位狀態(tài)
    {
        flag_interrupt = 1;
        printf("Run at EXTI\\r\\n");
        EXTI_ClearITPendingBit(EXTI_Line0);  //清除中斷標(biāo)志位
    }
}

進(jìn)入中斷服務(wù)函數(shù),改變了flag_interrupt的值,但是主函數(shù)仍然沒(méi)有運(yùn)行相應(yīng)的程序,很是奇怪,檢查反匯編代碼,才發(fā)現(xiàn)是編譯器對(duì)flag_interrupt變量的訪問(wèn)進(jìn)行了優(yōu)化,如圖,將程序下載至MCU后,給P1.0引腳下降沿觸發(fā)信號(hào),運(yùn)行現(xiàn)象如下

圖像

圖像

278:    01271063 bne    a4,s2,278 0x34> # 不相等就跳轉(zhuǎn)至0x278的位置,即還是本條語(yǔ)句的位置,

可以看到,編譯器對(duì)flag_interrupt變量的訪問(wèn)進(jìn)行了優(yōu)化,沒(méi)有重新去0x20000080的位置進(jìn)行取值,而是每次都用a4寄存器的值與s2寄存器(值為1)比較,不相等還是跳回本條語(yǔ)句的位置,重復(fù)運(yùn)行,導(dǎo)致即使在中斷中改變了其值,主循環(huán)中也不能運(yùn)行對(duì)應(yīng)的功能。 這時(shí)候就需要使用volatile關(guān)鍵字對(duì)flag_interrupt進(jìn)行修飾。

volatile uint8_t flag_interrupt = 0;

加了volatile關(guān)鍵字修飾flag_interrupt后,程序按照設(shè)定的預(yù)期運(yùn)行,如下圖所示:

圖像

查看反匯編代碼,編譯器未對(duì)flag_interrupt變量進(jìn)行優(yōu)化,老老實(shí)實(shí)的每次去源地址0x20000080處取值訪問(wèn)。

圖像

聲明:本文內(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)注

    5

    文章

    905

    瀏覽量

    42746
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4899

    瀏覽量

    70638
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1661

    瀏覽量

    50174
  • 關(guān)鍵字
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    7060
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    46

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    C語(yǔ)言關(guān)鍵字volatile的用法

    許多程序員都無(wú)法正確理解C語(yǔ)言關(guān)鍵字volatile,這并不奇怪。因?yàn)榇蠖鄶?shù)C語(yǔ)言書籍通常都是一兩句帶而過(guò),本文將告訴你如何正確使用它。
    發(fā)表于 04-11 09:35 ?2978次閱讀

    c語(yǔ)言中 volatile _Bool 關(guān)鍵字說(shuō)明

    volatile 關(guān)鍵字呢?volatile總是與優(yōu)化有關(guān),編譯器有種技術(shù)叫做數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、在哪里使用、在哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)
    發(fā)表于 01-06 10:46

    請(qǐng)問(wèn)關(guān)鍵字volatile該什么時(shí)候用?

    這東西的概念我懂,但是實(shí)際編程時(shí),關(guān)鍵字volatile該什么時(shí)候用啊,求大神來(lái)點(diǎn)經(jīng)驗(yàn)之談!
    發(fā)表于 04-28 09:06

    【原創(chuàng)分享】單片機(jī)編程關(guān)鍵字volatile

    、volatile其實(shí)和const樣是種類型修飾符,用它修飾的變量表示可以被某些編譯器未知的因素而改變,比如操作系統(tǒng)、硬件或者其他線程等等。遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對(duì)訪問(wèn)該
    發(fā)表于 06-29 11:17

    C語(yǔ)言volatile關(guān)鍵字詳解 精選資料分享

    1.volatile和什么有關(guān)百度翻譯是這樣子翻譯volatile的:圖1-1 百度翻譯volatile截圖volatile屬于C語(yǔ)言的關(guān)鍵字
    發(fā)表于 07-22 07:20

    volatile關(guān)鍵字應(yīng)用場(chǎng)景及示例

    volatile關(guān)鍵字1.應(yīng)用場(chǎng)景2.示例1.應(yīng)用場(chǎng)景volatile關(guān)鍵字分析,往往應(yīng)用在三種場(chǎng)合1)多線程編程共享全局變量的時(shí)候,該全局變量要加上
    發(fā)表于 08-24 07:21

    C語(yǔ)言volatile關(guān)鍵字之間有什么關(guān)系?

    C語(yǔ)言volatile關(guān)鍵字之間有什么關(guān)系?
    發(fā)表于 11-11 07:01

    嵌入式程序員常見(jiàn)的const、static、volatile關(guān)鍵字

    開(kāi)發(fā)中,const、static、volatile都是很常見(jiàn)的,我們嵌入式程序員需要熟知這三個(gè)關(guān)鍵字的恰當(dāng)用法。下面是我參照網(wǎng)路上的大咖,大牛的博,然后做些代碼測(cè)試,撰寫
    發(fā)表于 12-21 06:08

    C語(yǔ)言中的volatile關(guān)鍵字

    volatile關(guān)鍵字種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改。
    發(fā)表于 05-27 09:32 ?3331次閱讀

    關(guān)于volatile關(guān)鍵字對(duì)編譯器優(yōu)化的影響

    volatile關(guān)鍵字對(duì)編譯器優(yōu)化的影響
    的頭像 發(fā)表于 02-28 17:15 ?3257次閱讀

    般什么時(shí)候需要使用volatile關(guān)鍵字

    想必大家平時(shí)都見(jiàn)過(guò)volatile關(guān)鍵字,可是大家知道什么時(shí)候需要使用volatile關(guān)鍵字嗎?
    的頭像 發(fā)表于 12-24 17:29 ?1266次閱讀

    【嵌入式】C語(yǔ)言中volatile關(guān)鍵字

    volatile06. 附錄01. volatile概述volatile是C語(yǔ)言中的個(gè)關(guān)鍵字。將變量定義為
    發(fā)表于 10-21 10:21 ?6次下載
    【嵌入式】C語(yǔ)言中<b class='flag-5'>volatile</b><b class='flag-5'>關(guān)鍵字</b>

    Volatile關(guān)鍵字在嵌入式開(kāi)發(fā)中的應(yīng)用

    前言在進(jìn)行嵌入式開(kāi)發(fā)中,我們往往會(huì)看到個(gè)名為volatile或者_(dá)_IO的關(guān)鍵字,那么,它們對(duì)于嵌入式開(kāi)發(fā)有什么作用呢?淺析volatile數(shù)據(jù)類型實(shí)際上,__IO和
    發(fā)表于 11-02 18:21 ?6次下載
    <b class='flag-5'>Volatile</b><b class='flag-5'>關(guān)鍵字</b>在嵌入式開(kāi)發(fā)中的應(yīng)用

    C環(huán)境中的VOLATILE關(guān)鍵字

    volatile 提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這 個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)。如果沒(méi)有 volatile 關(guān)鍵字,則編譯器可能
    發(fā)表于 06-14 15:03 ?2次下載
    C環(huán)境中的<b class='flag-5'>VOLATILE</b><b class='flag-5'>關(guān)鍵字</b>

    單片機(jī)編程關(guān)鍵字volatile

    volatile 修飾的變量是說(shuō)這變量可能會(huì)被意想不到地改變。通常對(duì)于程序員而言,單片機(jī) 中用的就算常見(jiàn)了volatile 是易變的,不穩(wěn)定的意思。其實(shí)對(duì)于很多人來(lái)說(shuō),根本沒(méi)見(jiàn)過(guò)這個(gè)關(guān)鍵字,不 知道
    發(fā)表于 04-02 13:47 ?2次下載