TMS320F28335: 同一个变量主程序赋值和中断读取到的值不一致

Part Number: TMS320F28335

各位大佬们好,是这样的最近在测试的时候发现一个很邪门的事情。定义了一个16位的联合体A,其中成员B占用了A的2位,也就是uint16_t  B :2;,在主循环中没有抓到给B赋值为0的情况,给B赋值是这样的 A.bit.B=0; A.bit.B=1; A.bit.B=2; A.bit.B=3; 实际是有给B赋值成 1或2或3,就是没有0。但是在中断读取 A.bit.B的时候居然读到了0!!!

针对这样的现象我做了一个测试,在给联合体A的所有成员变量赋值时加了关全局中断保护,即:关全局中断; 给联合体A成员赋值; 开全局中断,这里给A的成员赋值也是通过A.bit.B这个方式赋值,这么一操作后就再也没出现异常了。

然后我又做了一个测试,在不加关中断保护的情况下,直接给整个联合体赋值:A.all = xxx; 这样写测试了好久也没发现出现异常。

再然后我又做了一个测试,定义了一个只有1位的成员,这个只有1位的成员在不加关中断保护的情况下也没出现异常。

请问各位大佬,为什么会出现这样的现象,原因是什么?无论是改成加中断保护还是改成整个联合体赋值改动都很大,还有没有其他更好的方案?谢谢各位大佬