我正在使用ARM Cortex M4 MCU。如果我有一个优先级为2的GPIO的中断处理程序和一个优先级为3的SPI驱动程序(即优先级低于GPIO),我从GPIO内部调用(阻塞)SPI读取中断处理程序,SPI函数会起作用吗?
答案 0 :(得分:2)
你的问题的答案取决于它如何阻止处理转移,正如@Notlikethat所说。
如果您的SPI驱动程序是轮询驱动程序,那么它很可能会起作用。在这种情况下,您的GPIO中断会旋转SPI外设内的标志,等待传输的每个部分完成。
如果您的SPI驱动程序是中断驱动的,那么它将无法工作。由于执行优先级2中断(GPIO),优先级3中断(SPI)将在GPIO中断完成后才会执行。根据SPI驱动程序的编写方式,这可能会使系统完全挂起,或者可能导致超时。
如果您的SPI驱动程序是DMA驱动的,那么答案就不那么明确,取决于驱动程序的工作原理。在这种情况下,您的事务可能会完成,但如果函数阻塞等待DMA中断,它可能永远不会到达,具体取决于其优先级。
在上述任何一种情况下,通常认为在中断内部做类似的事情并不是一个好主意。如果您有RTOS,则可以使用等待信号量执行SPI事务的高优先级任务,或者如果操作系统支持它,则使用延迟中断处理。如果您没有运行RTOS,我会考虑是否有一种方法可以发出较低优先级的中断信号(即使用最低优先级的PendSV)或监视主进程内的标志。使用较低优先级的中断,您仍然可以抢占主进程(如果需要的话),但所有其他中断都可以继续执行。如果你可以在主进程中监视一个标志,那么这也可以让你的中断继续,但如果你有时间限制,这可能不太可能(再次,取决于你的应用程序的结构)