TMS320F28335: 程序运行过程中,在没有对变量赋值的情况下,中断函数读取变量值异常

Part Number: TMS320F28335

程序跑的是裸机,定义了一个结构体SS,该结构体为16位,其中分配2位做一个标志位。在主程序中会给这个标志位赋值,例如SS.bit.AA=1,SS.bit.AA=0。在测试过程中发现在中断判断这个SS.bit.AA时出现AA为0的情况,抓取程序运行状态,主程序并没有运行到SS.bit.AA=0的部分代码,SS结构体的其他位可能会被赋值。代码中做了修改,SS结构体所有成员在赋值前加入关全局中断,赋值完后重新打开全局中断的保护操作。增加这个保护后测试较多次也未发现异常。

请问是什么原因导致在中断读取AA时出现异常?该用什么方法杜绝此类问题?

  • 您好

    您想问的是为什么还没进行判断就被赋值了吗?还是中断出现会打断读取标志位的过程?

  • 您好

    我想问的是为什么进中断时读到的值会是0,在整个主循环的过程中都没有进入到赋值0的逻辑,但是在中断函数里读取到的这个值却是0。

    主循环程序运行整个过程会出现 SS.bit.AA = 1; SS.bit.AA = 2; SS.bit.AA = 3; 就是没有SS.bit.AA = 0;  (SS的其他位也会被赋值,调用的地方太多无法判断)。

    难道是在往SS的地址里写值的时候刚好被中断打断了才会出现这样的现象?

  • 您好

    难道是在往SS的地址里写值的时候刚好被中断打断了才会出现这样的现象?

    有可能,您对于结构体的元素定义是整型吗?如果中断导致赋值过程的丢失或者缺失,可能带来这个过程,建议您考虑用变量跟踪来做调试复现这个,如果可以复现,请考虑中断屏蔽或中断优先级优化。

  • 说错了不好意思,是联合体,定义的是16位无符号整形的联合体,成员AA定义:uint16_t  AA : 2; 根据这个现象我做了如下的测试:

    1. 在不关全局中断的情况下直接给整个联合体赋值,即 SS.all = xxx;这样测试没发现异常;

    2. 在不关全局中断的情况下给只有一个位的成员赋值,即 uint16_t CC :1;  SS.bit.CC = 1;  然后在中断中读取SS.bit.CC,这样测试也没发现异常;

    当然上述2个测试条件也有可能是测试的时间不够久还没到出现异常的时候,我会继续测试。

    根据上述2个测试情况我又有了新的疑问,为啥直接给整个联合体赋值和只有1位的成员没发现异常?

  • 您好

    如上说明,建议您通过变量跟踪来监察赋值过程,关不关全局中断只是做了一个理想环境,您要复现的是中断影响是否导致赋值过程存在丢失或缺失。

    根据上述2个测试情况我又有了新的疑问,为啥直接给整个联合体赋值和只有1位的成员没发现异常?

    没有足够的资料能给出这个相关推测建议