STM32 代碼中類型修飾符 volatile 的作用
而今天的問題在于 做這個(gè)Function generator時(shí)編寫的一套簡單串口終端界面出現(xiàn)了一個(gè)令我百思不得其解小BUG.....
本文引用地址:http://cafeforensic.com/article/201612/325208.htm輸入部分:
USART2_Puts(star[wav_mode-1]);
USART2_Puts(" Enter Frequency: ");
while(Uart2_Get_Data!=0x0d&&nde<6)
{
if(Uart2_Get_Flag)
{
Uart2_Get_Flag=0;
tmp[nde++]=Uart2_Get_Data;
if(tmp[nde-1]<48||tmp[nde-1]>57)nde--;
else USART2_Putc(tmp[nde-1]);
//Uart2_Get_Flag=0;
//Uart2_Get_Data=60;
}
USART2_Puts(star[wav_mode-1]);
USART2_Puts(" Enter Frequency: ");
while(Uart2_Get_Data!=0x0d&&nde<6)
{
if(Uart2_Get_Flag)
{
Uart2_Get_Flag=0;
tmp[nde++]=Uart2_Get_Data;
if(tmp[nde-1]<48||tmp[nde-1]>57)nde--;
else USART2_Putc(tmp[nde-1]);
//Uart2_Get_Flag=0;
//Uart2_Get_Data=60;
}
中斷:
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Uart2_Get_Data=USART_ReceiveData(USART2);
Uart2_Get_Flag=1;
}
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
Uart2_Get_Data=USART_ReceiveData(USART2);
Uart2_Get_Flag=1;
}
開始的時(shí)候Uart2_Get_Data的類型是 U8 以前也是這么做的 沒有問題的,但偏偏這次有問題 就是在輸入的時(shí)候
Enter Frequency: 后面的數(shù)字總是重復(fù)的 一般重復(fù)兩次比如圖上的2244 而且有時(shí)單步仿真的時(shí)候問題又消失了。
Enter Frequency: 后面的數(shù)字總是重復(fù)的 一般重復(fù)兩次比如圖上的2244 而且有時(shí)單步仿真的時(shí)候問題又消失了。
代碼不斷地改 越改越亂~~~
突然注意到 用SysTick_Handler延時(shí)的中斷里 數(shù)據(jù)的類型被volatile修飾過,問題可能在這
馬上..........
volatile u8 Uart2_Get_Flag;//串口2接收到數(shù)據(jù)
volatile u8 Uart2_Get_Data;//串口2接收的數(shù)據(jù)
volatile u8 Uart2_Get_Data;//串口2接收的數(shù)據(jù)
問題解決了~~?。?/div>
沒有用volatile關(guān)鍵字聲明的變量在被訪問的時(shí)候可能直接從cpu的寄存器中取值(因?yàn)橹癷被訪問過,也就是說之前就從內(nèi)存中取出i的值保存到某個(gè)寄存器中),之所以直接從寄存器中取值,而不去內(nèi)存中取值,是因?yàn)榫幾g器優(yōu)化代碼的結(jié)果(訪問cpu寄存器比訪問ram快)。
然而在 串口中斷里 Uart2_Get_Data 的值可能被“以外修改”而CPU寄存器的值沒變所以出問題了。volatile關(guān)鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:中斷、system、硬件或者其它線程等。遇到這個(gè)關(guān)鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進(jìn)行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。
按理說凡是在中斷里等頻繁更新而外部頻繁調(diào)用的值都應(yīng)當(dāng)用volatile進(jìn)行修飾.
關(guān)鍵詞:
STM32代碼類型修飾符volatil
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號放大器
評論