<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32 代碼中類型修飾符 volatile 的作用

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

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

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

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




          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();