[求助] 请教一个关于编程的问题

2835   2017-11-16 18:39 楼主
如果我需要在一个中断服务子程序里面修改一个变量值,在另一个中断服务子程序里面调用它,需要注意什么?直接调用?像下面这段示例就可以了吗?
int pwm; //定义变量
main{
....
}


ISR1()
{
pwm=xxx; //修改pwm的值
}
ISR2()
{
CMPA=pwm; //pwm值赋CMPA寄存器
}

回复评论 (10)

没问题。
点赞  2017-11-16 19:37
一个读写动作,一个只读,一般不需要考虑互斥。
点赞  2017-11-17 10:25
引用: shower.xu 发表于 2017-11-17 10:25
一个读写动作,一个只读,一般不需要考虑互斥。

如果赋值操作不止一个指令周期呢?会不会在没有赋值完成的情况下被打断进入下面那个中断(当然是支持抢占优先级的,且下面那抢占优先级高),从而读出来错误的值呢?另外如果是一个指令周期的话,在执行赋值操作时被另一中断打断,那么CPU应该会执行完赋值操作然后再跳到另一个中断是吗?
人有的时候真是奇怪,选择了会后悔,放弃了会遗憾,完美只能是一种理想,不是一种存在。
点赞  2017-11-17 10:39
引用: huixianfxt 发表于 2017-11-17 10:39
如果赋值操作不止一个指令周期呢?会不会在没有赋值完成的情况下被打断进入下面那个中断(当然是支持抢占 ...

没有绝对的安全,你要做的,是把不稳定性尽量降低。如果存在抢占优先级。你就要尽量把低优先级的中断里的代码尽量简化,执行最关键的部分,减少其执行时间,这样,被抢的概率就降低。
点赞  2017-11-17 12:40
引用: huixianfxt 发表于 2017-11-17 10:39
如果赋值操作不止一个指令周期呢?会不会在没有赋值完成的情况下被打断进入下面那个中断(当然是支持抢占 ...

对应优先级更高的中断,如果不是外部中断,是自己周期控制的,看看能否把周期适当加大。也可以减少抢断的可能性。先大概写一个程序。看看效果。不合适,再调。
点赞  2017-11-17 12:44
引用: huixianfxt 发表于 2017-11-17 10:39
如果赋值操作不止一个指令周期呢?会不会在没有赋值完成的情况下被打断进入下面那个中断(当然是支持抢占 ...

那是中断优先级的事,而且即使赋值分成两条指令,比如先保存常数到Acc,然后再放到寄存器,中断程序也会对A寄存器做入栈出栈操作的。如果硬件不做,你就自己做。
点赞  2017-11-17 13:52

好的,谢谢版主
点赞  2017-11-17 16:23
引用: ienglgge 发表于 2017-11-17 12:44 对应优先级更高的中断,如果不是外部中断,是自己周期控制的,看看能否把周期适当加大。也可以减少抢断的 ...
目前赋值的中断发生周期远小于读取的中断产生周期。就是ISR1发生频率大于ISR2发生频率的很多倍。而且前者优先级高于后者。 本帖最后由 2835 于 2017-11-17 16:36 编辑
点赞  2017-11-17 16:34
引用: 2835 发表于 2017-11-17 16:34
目前赋值的中断发生周期远小于读取的中断产生周期。就是ISR1发生频率大于ISR2发生频率的很多倍。而且前者 ...

赋值的中断发生周期远小于读取的中断产生周期,这比赋值远大于读取的情况应该是好一些的。可能出现,读取的是一个值,然后被抢断,值被改了。但是读取中断处理的是改之前的值。当下一次,读取时,才得到正确的值,你把读取函数的执行内容好好处理一下,如果值不变,应该执行什么。比如保持状态,什么的,减少影响。应该问题不大。
点赞  2017-11-20 13:53
变量定义为全局变量
点赞  2017-12-25 20:07
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复