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.

TMS320F28377D: 编译器优化导致的中断读取而非中断任务中赋值的位域量错误

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