Arm 嵌入式系统我们可以使用ISR内部的任何功能吗?

Arm 嵌入式系统我们可以使用ISR内部的任何功能吗?,arm,embedded,Arm,Embedded,我偶然发现了一个关于嵌入式系统的问题,我们可以调用ISR中的函数吗? 工作臂Cortex M4已多次从ISR调用该功能,未出现任何故障 我假设其他微控制器的行为也会相同,还是我错了 注意:请忽略在ISR中调用函数会增加我的ISR时间,进而增加中断延迟。通常,没有任何东西可以阻止您从ISR调用函数。然而,有些事情需要考虑。 首先,您应该尽可能缩短ISR。在某些情况下,甚至函数调用开销也可能被认为太大。因此,如果您从ISR内部调用函数,最好将这些函数内联 您还必须确保被调用的函数是可重入函数,或者它

我偶然发现了一个关于嵌入式系统的问题,我们可以调用ISR中的函数吗? 工作臂Cortex M4已多次从ISR调用该功能,未出现任何故障

我假设其他微控制器的行为也会相同,还是我错了


注意:请忽略在ISR中调用函数会增加我的ISR时间,进而增加中断延迟。

通常,没有任何东西可以阻止您从ISR调用函数。然而,有些事情需要考虑。 首先,您应该尽可能缩短ISR。在某些情况下,甚至函数调用开销也可能被认为太大。因此,如果您从ISR内部调用函数,最好将这些函数内联

您还必须确保被调用的函数是可重入函数,或者它不会被除ISR之外的代码的其他部分调用。如果主程序和ISR都调用了一个非重入函数,那么您将得到严重但微妙的“竞争条件”bug。(就像主程序和ISR在没有信号量保护的情况下,以非原子方式修改相同的共享变量一样。)


最后,设计一个带有中断的系统,你不知道系统中是否还有其他中断,这是完全不专业的。在设计单个中断时,必须始终考虑程序的中断情况。否则,程序将不存在实时性能,参与项目的程序员也不会真正知道程序在做什么。从没有人知道他们在做什么的角度来看,bug肯定会随之而来。

一般来说,没有什么能阻止您从ISR调用函数。然而,有些事情需要考虑。 首先,您应该尽可能缩短ISR。在某些情况下,甚至函数调用开销也可能被认为太大。因此,如果您从ISR内部调用函数,最好将这些函数内联

您还必须确保被调用的函数是可重入函数,或者它不会被除ISR之外的代码的其他部分调用。如果主程序和ISR都调用了一个非重入函数,那么您将得到严重但微妙的“竞争条件”bug。(就像主程序和ISR在没有信号量保护的情况下,以非原子方式修改相同的共享变量一样。)


最后,设计一个带有中断的系统,你不知道系统中是否还有其他中断,这是完全不专业的。在设计单个中断时,必须始终考虑程序的中断情况。否则,程序将不存在实时性能,参与项目的程序员也不会真正知道程序在做什么。从没有人知道他们在做什么的角度来看,bug肯定会随之而来。

一些RTO将强制执行一项策略,即可以从ISR上下文调用或不能从ISR上下文调用其宏,即阻塞某些共享资源的函数。例如:


一些RTO将强制执行一个策略,即可以从ISR上下文调用或不能从ISR上下文调用其宏,即阻止某些共享资源的函数。例如:


该函数是否仅由ISR调用?功能是否可重入?是否有其他优先级更高的中断可以中断您的ISR?所以:你应该再详细一点来得到答案。否则太宽。函数是否仅由ISR调用?否:函数是否可重入?是的,是否有其他优先级更高的中断可以中断您的ISR?我们的代码不了解整个系统以及是否存在更高优先级的ISR。根据这些答案,将该函数调用到ISR中是安全的,只要最坏的竞争条件允许下一个ISR调用可以服务。该函数是否仅由ISR调用?功能是否可重入?是否有其他优先级更高的中断可以中断您的ISR?所以:你应该再详细一点来得到答案。否则太宽。函数是否仅由ISR调用?否:函数是否可重入?是的,是否有其他优先级更高的中断可以中断您的ISR?我们的代码不了解整个系统以及是否存在更高优先级的ISR。根据这些答案,将该函数调用到ISR中是安全的,只要最坏的竞争条件允许下一个ISR调用可以服务。您还需要确保操作系统保存例程可能使用的寄存器。例如,如果您有浮点或霓虹灯,则需要保存这些寄存器。应仔细管理协处理器寄存器和其他特殊机器资源。也许有帮助:@artlessnoise鉴于Cortex M,我假设使用了裸机或RTOS。您还需要确保操作系统保存例程可能使用的寄存器。例如,如果您有浮点或霓虹灯,则需要保存这些寄存器。应仔细管理协处理器寄存器和其他特殊机器资源。也许有帮助:@artlessnoise考虑到Cortex M,我假设使用了裸机或RTOS。