此问题适用于最新的 CCS 版本。 我有一个例程会延迟可调的毫秒计数。 ISR 每 ms 递增一次 MsCount。 以下 c 代码等待 mSDuration ms 后再返回:
// c 代码例程等待设定的 ms 计数
//计时器 ISR 每 ms 递增一次 MxCount
WaitTimer = MsCount;//初始化计数
//当 MsCount 增长到超过等待时间的 mSDuration 时,等待就会结束
while ((MsCount - WaitTimer)< mSDuration);
此延迟适用于优化级别1:以下是针对优化级别1的反汇编。 代码将 MsCount 加载到 R15 (e1be)、然后减去 WaitTimer (e1c2)并将结果与 mSDuration (e1c6)进行比较。
171 WaitTimer = MsCount;
e1b8:4292 02F4 02E6 MOV.W &MsCount、&WaitTimer
172 while ((MsCount - WaitTimer)< mSDuration)
$C$L2:
e1be:421F 02F4 MOV.W &MsCount、R15
e1c2:821F 02E6 sub.W WaitTimer、R15
e1c6:912F CMP.W @SP、R15
e1c8:2BFA JLo ($C$L2)
优化2跳过减法、R15永不改变。 while 循环被卡住。
171 WaitTimer = MsCount;
e12e:4292 02F4 02E6 MOV.W MsCount、WaitTimer
E134:430F CLR.W R15
172 while ((MsCount - WaitTimer)< mSDuration);
$C$L2:
E136:912F CMP.W @SP、R15
E138:2BFE JLO ($C$L2)
优化为何会排除基本步骤? 有什么建议吗?