我偶然发现了这个嵌入式系统问题,我们可以在ISR中调用一个函数吗? 使用ARM Cortex M4,从ISR多次调用函数,没有任何错误。
我认为其他微控制器的行为也一样,或者我错了?
注意:请忽略在ISR中调用函数会增加我的ISR时间,从而增加中断延迟。
答案 0 :(得分:1)
通常,没有什么可以阻止您从ISR调用函数。但是有些事情需要考虑。
首先,您应该尽可能缩短ISR。在某些情况下,甚至函数调用开销也可能被认为太多。因此,如果从ISR内部调用函数,则内联这些函数可能是明智的。
您还必须确保被调用的函数是可重入的,或者除了ISR之外,它不会被代码的其他部分调用。如果主程序和你的ISR都调用了非重入函数,那么你将会遇到严重但微妙的竞争条件"错误。 (正如您所说,如果主程序和ISR非原子地修改相同的共享变量,没有信号量保护。)
最后,设计一个带有中断的系统,你不知道系统中是否还有其他中断,这是完全不专业的。在设计各个中断时,必须始终将程序的中断情况视为整体。否则,程序将不具有实时性能,并且项目中没有程序员真正知道程序正在做什么。从没有人知道他们在做什么的角度来看,肯定会出现错误。
答案 1 :(得分:0)
某些RTOS将强制执行以下策略:可以从ISR上下文调用哪些宏,也可以不调用它,即将阻止某些共享资源的函数。例如: