
本期話題
群友在群里咨詢的一個問題:Freertos 里高優先級的任務中改變了全局變量值,低優先級的任務中循環等待值的改變;為何高優先級任務里的值改變后,低優先級循環沒有結束并向下執行呢?
高優先級任務中的代碼,修改全局變量:
if(1000 <= Complete)
{
????update_flag = 1;
????printf("update_flag = [%d]\n”, update_flag);
}
vTaskDelay(10);低優先級任務中的代碼,判斷全局變量:
while(!update_flag); // 判斷
......聊一聊
如果你能想到關鍵詞 volatile,那么恭喜你,你已經真正理解了這個關鍵詞。
之前分享過相關的文章:嵌入式 C 語言經常提到的關鍵詞 volatile
告訴這位小伙伴在全局變量定義的時候,加上 volatile。問題得到解決。好了,萬事大吉。
顯然,為了證實我們的猜想,我們進行逐步分析。

這個項目開啟了編譯一級優化。這樣就解釋通了,編譯器開啟了優化,并且變量定義沒有添加關鍵詞 volatile 。這兩點組合起來導致問題發生。
while(!update_flag)
{
????printf("update_flag = [%d]\n”, update_flag);
????vTaskDelay(10);
}嵌入式 C 語言經常提到的關鍵詞 volatile
【C語言】徹底搞懂內存屏障與volatile


覺得文章不錯,點擊“分享”、“贊”、“在看” 唄!