我有一个可以由主代码和中断代码填充的ringbuffer。 (中断也可以由其他导入的中断中断中断中断中断)。 正确的中断处理非常重要!
要解决这个问题,我需要 对我的ringbuffer进行原子操作。
index=buffer.next =(buffer.next +1)% 16;
所以我可以在我的ringbuffer中保留一个要填充的位置(索引)。
执行此操作的最佳方式是什么?
谢谢!
EVS
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.
我有一个可以由主代码和中断代码填充的ringbuffer。 (中断也可以由其他导入的中断中断中断中断中断)。 正确的中断处理非常重要!
要解决这个问题,我需要 对我的ringbuffer进行原子操作。
index=buffer.next =(buffer.next +1)% 16;
所以我可以在我的ringbuffer中保留一个要填充的位置(索引)。
执行此操作的最佳方式是什么?
谢谢!
EVS
你好 ,EVs
有时我们会按照您的建议使用DINT/EINT进行短原子操作。 DINT和EINT是"_ASM ("SETC INTM")"和"_ASM ("CLRC INTM")"的宏定义。
在这种情况下,您不会丢失中断,但如果设置了中断标志而存在“DINT”,则中断会延迟。 延迟取决于DINT内部操作的持续时间... EINT。 在您的情况下,它只需几个周期。 不可怕
另外,我建议您将“%16”操作更改为“&15”操作(按位AND)。 它们在您的情况下具有相同的效果,但"&"运算符会更快。
(我已签入我的项目-%16与&15一样转换为ASM)
您好,EVs:
是的,如果设置了INTM,则将来来自同一线路或组(对于外围设备中断)的同一通道的中断可能会被忽略。 对于像您一样的短期运营来说,这不应该是问题。
正如您正确提到的,每个新的和待处理的中断都存储在IFR中。 如果同时启用了IER和INTM,则CPU会批准中断,清除IFR以用于将来的中断,并进一步为其提供服务。
如果设置了INTM,CPU无法确认中断,因此IFR将保持锁定,并将设置PIEACK。 因此,CPU将来可能会错过同样类型的中断。
清除INTM后,CPU将确认待处理中断,IFR将被清除。 通过清除PIEACK在ISR中确认中断。 只有这样,进一步的中断才能传播到CPU。
谢谢
Vasudha