ARM Cortex-M4中断优先级



我使用的是ARM Cortex-M4 MCU。如果我有一个优先级为2的GPIO的中断处理程序和一个优先级为3的SPI驱动程序(即,优先级低于GPIO的),并且我调用从GPIO的中断处理程序内读取的(阻塞)SPI, SPI函数会工作吗?

你的问题的答案取决于它如何阻塞来处理传输,正如@Notlikethat所说的。

如果您的SPI驱动程序是轮询驱动程序,那么它很可能会工作。在这种情况下,您的GPIO中断将在SPI外设中的标志上旋转,等待传输的每个部分完成。

如果您的SPI驱动程序是中断驱动的,那么它将无法工作。由于您正在执行优先级为2的中断(GPIO),所以在GPIO中断完成之前,优先级为3的中断(SPI)将不会执行。根据您的SPI驱动程序的编写方式,这可能会使您的系统完全挂起,或者可能导致超时。

如果您的SPI驱动程序是DMA驱动的,那么答案就不那么清楚了,取决于驱动程序的工作方式。在这种情况下,你的事务可能会完成,但如果函数已经阻塞等待DMA中断,它可能永远不会到达,这取决于它的优先级。

在上述任何一种情况下,通常认为在中断中做这样的事情都不是一个好主意。如果您有RTOS,您可以使用等待信号量的高优先级任务来执行SPI事务,或者如果操作系统支持它,则使用延迟中断处理。如果你没有使用RTOS,我会考虑是否有一种方法可以发出低优先级中断的信号(即在最低优先级使用PendSV)或从主进程内监视标志。使用较低优先级的中断,您仍然可以抢占主进程(如果需要的话),但是所有其他中断可以继续执行。如果您可以监视主进程中的标志,那么这也将允许您的中断继续,但如果您时间有限,这可能不太可能(再次,取决于您的应用程序的结构)

最新更新