Part Number: TMS320F28377D
编译器 V22.6.0.LST 优化开到O2。
如下代码,位域形式启停命令 gInv.CsBit.RunStop在慢速非中断任务更新,此启停命令在我主中断中的状态机会读取更改状态。
反汇编发现,赋值过程是先清除位域再赋值,未使用中间变量。这导致清除位域量还未赋值时就被中断打断并读取,中断状态机获取了错误的清零后的命令而切换到错误状态。属于严重漏洞,请修复。
#if 01//不禁用优化会偶发错误,编译器问题,没有使用中间变量寄存器,直接先清除位在赋值更新,在中断有可能中途清除运行命令
gInv.CsBit.RunStop=RunStop;
#else//避免中断情况调用此位域时,编译器优化未用中间变量导致的bug
if (RunStop==D_Run)
{
gInv.CsBit.RunStop=D_Run;
}
else
{
gInv.CsBit.RunStop=D_Stop;
}
#endif