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.

TMS320F28335: 主循环与中断服务函数之间的共享全局变量存在冲突

Part Number: TMS320F28335


你好!

请问如何规避主循环与中断服务函数对全局变量的访问冲突?

示例代码如下:

#define OK 1 //设备状态正常
#define ERROR 0 //设备状态异常

#define ON 1 //打开阀门
#define OFF 0 //关闭阀门

void main(void)
{
  	/*初始化全局变量*/
    volatile int Status = OK; //设备状态正常
    volatile int Valve = ON; //打开阀门
    
    while(1)
    {
        if(OK == Status) //若设备正常。Step.1
        {
            Switch = ON; //打开阀门。Step.4
        }
    }
}

/*
* 中断服务函数
* 说明:当外部中断发生时,进入该中断服务函数
*/
void ISR_Interrupt(void)
{
    Status = ERROR; //设备状态异常。Step.2
    Switch = OFF; //关闭阀门。Step.3
}

代码分析:

假设CPU执行到Step1语句时,外部中断发生。此时,CPU跳转至中断服务函数,执行语句Step2和Step3。待中断服务函数执行完毕,CPU回到主循环,继续执行语句Step4。产生的结果:在中断服务函数中关闭阀门,但是在主循环中又将阀门打开,导致错误结果。

若通过宏定义DINT和EINT操作全局中断,来保护主循环代码段不被中断打断,将严重影响PWM和ADC中断服务函数的高频执行。

请问有何方法能在不使用RTOS的情况下,规避主循环和中断服务函数 对共享变量的操作冲突?

  • 你好,

    在中断服务函数中关闭阀门,但是在主循环中又将阀门打开,导致错误结果。

    这里应该是不会对Switch变量同时操作的吧?进入中断服务函数之后status的值为ERROR,不满足主函数循环中的if条件。

  • 假设某种情景下CPU的执行时序:开始时,Status的值为OK,CPU在主循环中通过if语句判断条件为真,即将执行“Switch = ON”语句。正当此时,外部中断触发,CPU转至中断服务函数,执行“Switch = OFF”语句。待中断服务函数全部执行完毕,CPU重新回到主循环被打断的地方继续执行“Switch = ON”语句。最终Switch的值为ON。

  • 我查看下相关资料后回复您。

  • 你好,抱歉回复晚了:

    /*初始化全局变量*/
    volatile int Status = OK; //设备状态正常
    volatile int Valve = ON; //打开阀门

    这里上述两个变量是要定义全局变量还是局部变量?

    这里定义在了main函数中,但是注释是全局变量。能否更正一下,然后将正确的代码发送上来?