关于单片机中全局变量的使用问题
最近在看一个程序,程序周期的读取全局变量的值进行处理,同时这个全局变量会在中断中被改变。
但是我觉得这样使用全局变量有问题,如果当前正在读取全局变量时中断到达,那么这个全局变量会在中断中改变,中断返回的时候会不会照成我正在读取的这个中断变量错误(混乱)呢?
程序大概如下,大家帮我分析一下?
unsigned char wucValue;/*全局变量*/
/*周期任务*/
Task_10ms()\
{
unsigned char aucTemp;
aucTemp = get_value();
}
/**/
unsigned char get_value(void)
{
retrun ((wucValue >> 3) & 0x01);
}
/*中断处理*/
_ISR SPI_Interrupt
{
wucValue = SPI_DATA; /*SPI数据寄存器*/
Clear_ISR_SPI();
}
万分感谢
[解决办法]
如果你可以保证你的读取操作是一个原子操作,它就无法被中断打断
如果你的实时性不是很高,在中断中只 update 数据,在其余部不改写数据
[解决办法]
用一个标志变量
在中断中修改它,用以通知你那个定时函数,当前数据是刷新过的
具体,还可以根据你的应用,通过这个标志来限定你数据的合法性
[解决办法]
会的
不过你这个周期函数也是时间中断,所以要进入SPI_Interrupt的话除非它的优先级更高,而且有的程序都直接设置不能中断嵌套,那样的话SPI_Interrupt就要等时间中断结束后才能执行了