新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 代碼中類型修飾符 volatile 的作用

        STM32 代碼中類型修飾符 volatile 的作用

        作者: 時間:2016-12-03 來源:網絡 收藏
        今天還在做 STM32 DAC Function generator 唉~ 畢竟單片機的機能有限,做函數發生器略顯吃力,不過STM32自帶DAC能實現 100KHz 40樣點正弦信號 確實已經相當強悍了。DAC 使用DMA + 定時器觸發轉換。

        而今天的問題在于 做這個Function generator時編寫的一套簡單串口終端界面出現了一個令我百思不得其解小BUG.....

        本文引用地址:http://www.104case.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;
        }
        中斷:
        if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)
        {
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);
        Uart2_Get_Data=USART_ReceiveData(USART2);
        Uart2_Get_Flag=1;
        }
        開始的時候Uart2_Get_Data的類型是 U8 以前也是這么做的 沒有問題的,但偏偏這次有問題 就是在輸入的時候
        Enter Frequency: 后面的數字總是重復的 一般重復兩次比如圖上的2244 而且有時單步仿真的時候問題又消失了。
        代碼不斷地改 越改越亂~~~
        突然注意到 用SysTick_Handler延時的中斷里 數據的類型被volatile修飾過,問題可能在這
        馬上..........
        volatile u8 Uart2_Get_Flag;//串口2接收到數據
        volatile u8 Uart2_Get_Data;//串口2接收的數據
        問題解決了~~!!
        沒有用volatile關鍵字聲明的變量在被訪問的時候可能直接從cpu的寄存器中取值(因為之前i被訪問過,也就是說之前就從內存中取出i的值保存到某個寄存器中),之所以直接從寄存器中取值,而不去內存中取值,是因為編譯器優化代碼的結果(訪問cpu寄存器比訪問ram快)。
        然而在 串口中斷里 Uart2_Get_Data 的值可能被“以外修改”而CPU寄存器的值沒變所以出問題了。volatile關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如:中斷、system、硬件或者其它線程等。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
        按理說凡是在中斷里等頻繁更新而外部頻繁調用的值都應當用volatile進行修飾.




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 科尔| 二手房| 梧州市| 团风县| 仪陇县| 永年县| 岑巩县| 金湖县| 岗巴县| 鞍山市| 上思县| 泸溪县| 环江| 循化| 收藏| 呼图壁县| 阿拉善盟| 苏尼特右旗| 沭阳县| 海林市| 龙井市| 辽源市| 江川县| 长汀县| 和平区| 安岳县| 正阳县| 基隆市| 漳州市| 汕头市| 论坛| 溧水县| 晋州市| 分宜县| 双流县| 通海县| 都匀市| 尼木县| 英吉沙县| 荃湾区| 两当县|