本期话题
群友在群里咨询的一个问题: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
觉得文章不错,点击“分享”、“赞”、“在看” 呗!