This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
【问题现象】
编译平台CCS12.6,编译器22.6.0,开2级优化,有一个中断变量 IsrVar.A,在中断内进行计时供主循环使用,在执行一下代码时卡死。本意是想通过中断延时一段时间的,后面测试时发现卡在了死循环里。
IsrVar.A = 0;
while (IsrVar.A > 100) {
赋值语句1;}
赋值语句2;
【原因分析】
查看汇编代码发现while循环的判断表达被固定成使用0了,从这个现象来看原因是中断变量未指明外部属性,编译器优化时根据上下文可以确定IsrVar.A的值,不会重新读取以提高执行效率。
查看编译器优化说明文档《TMS320C28x Optimizing C_C++ Compiler_v22.6.0.LTS.pdf》,在3.16.8这一节有说影响循环次的变量的表达式会被优化成更高效的,我认为这就是对此现象的官方解释,请问我的理解是否正确?
IsrVar。 使用 volatile 关键字定义的? 否则、请使其具有易失性。 我相信这会解决这个问题。 如果 volatile 不能解决问题,那么对于包含...
IsrVar.A = 0;
While (IsrVar.A > 100) {
Assignment statement 1;}
Assignment statement 2;
请参考此链接
http://software-dl.ti.com/ccs/esd/documents/sdto_cgt_How-to-Submit-a-Compiler-Test-Case.html
我表达有误,我上面说的外部属性是指 volatile 属性,我是想问如果我举例中变量没有volatile 属性被编译器优化我上传的图中位置处是不是就是对应的解释。
编译器始终尝试将变量以及中间计算的结果保存在寄存器中、而不是存储器中。 编译器能够执行的操作越多、代码运行的速度就越快。 当 volatile 应用于变量时、这意味着编译器必须与原始源代码完全相同地读取或写入该变量。 这意味着变量不能保留在寄存器中。