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)。
-
中斷
+關(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
發(fā)布評(píng)論請(qǐng)先 登錄
C語(yǔ)言關(guān)鍵字volatile的用法
c語(yǔ)言中 volatile _Bool 關(guān)鍵字說(shuō)明
請(qǐng)問(wèn)關(guān)鍵字volatile該什么時(shí)候用?
【原創(chuàng)分享】單片機(jī)編程關(guān)鍵字之volatile
C語(yǔ)言volatile關(guān)鍵字詳解 精選資料分享
volatile關(guān)鍵字應(yīng)用場(chǎng)景及示例
嵌入式程序員常見(jiàn)的const、static、volatile關(guān)鍵字
C語(yǔ)言中的volatile關(guān)鍵字
關(guān)于volatile關(guān)鍵字對(duì)編譯器優(yōu)化的影響
一般什么時(shí)候需要使用volatile關(guān)鍵字
【嵌入式】C語(yǔ)言中volatile關(guān)鍵字

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

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

評(píng)論