你好!
请问如何规避主循环与中断服务函数对全局变量的访问冲突?
示例代码如下:
#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的情况下,规避主循环和中断服务函数 对共享变量的操作冲突?