如果我需要在一个中断服务子程序里面修改一个变量值,在另一个中断服务子程序里面调用它,需要注意什么?直接调用?像下面这段示例就可以了吗?
int pwm; //定义变量
main{
....
}
ISR1()
{
pwm=xxx; //修改pwm的值
}
ISR2()
{
CMPA=pwm; //pwm值赋CMPA寄存器
}
如果赋值操作不止一个指令周期呢?会不会在没有赋值完成的情况下被打断进入下面那个中断(当然是支持抢占优先级的,且下面那抢占优先级高),从而读出来错误的值呢?另外如果是一个指令周期的话,在执行赋值操作时被另一中断打断,那么CPU应该会执行完赋值操作然后再跳到另一个中断是吗?
人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。
没有绝对的安全,你要做的,是把不稳定性尽量降低。如果存在抢占优先级。你就要尽量把低优先级的中断里的代码尽量简化,执行最关键的部分,减少其执行时间,这样,被抢的概率就降低。
对应优先级更高的中断,如果不是外部中断,是自己周期控制的,看看能否把周期适当加大。也可以减少抢断的可能性。先大概写一个程序。看看效果。不合适,再调。
那是中断优先级的事,而且即使赋值分成两条指令,比如先保存常数到Acc,然后再放到寄存器,中断程序也会对A寄存器做入栈出栈操作的。如果硬件不做,你就自己做。
目前赋值的中断发生周期远小于读取的中断产生周期。就是ISR1发生频率大于ISR2发生频率的很多倍。而且前者优先级高于后者。
本帖最后由 2835 于 2017-11-17 16:36 编辑
赋值的中断发生周期远小于读取的中断产生周期,这比赋值远大于读取的情况应该是好一些的。可能出现,读取的是一个值,然后被抢断,值被改了。但是读取中断处理的是改之前的值。当下一次,读取时,才得到正确的值,你把读取函数的执行内容好好处理一下,如果值不变,应该执行什么。比如保持状态,什么的,减少影响。应该问题不大。