我用的是ARM皮层M4单片机。如果我有一个优先级为2的GPIO的中断处理程序和一个优先级为3的SPI驱动程序(即,优先级低于GPIO的中断处理程序),并且我从GPIO的中断处理程序中调用(阻塞) SPI读取,SPI函数是否可以工作?
发布于 2016-09-16 10:36:37
你的问题的答案取决于它是如何阻止处理传输的,就像@Notlikethat说的那样。
如果您的SPI驱动程序是轮询驱动程序,那么它很可能会工作。在这种情况下,GPIO中断将在SPI外设内的标志上旋转,等待传输的每个部分完成。
如果您的SPI驱动程序是中断驱动的,那么它将无法工作。由于您正在执行优先级2中断( GPIO ),因此在GPIO中断完成之前,优先级3中断(SPI)将不会执行。根据SPI驱动程序的编写方式,这可能会使系统完全挂起,也可能会导致超时。
如果您的SPI驱动程序是DMA驱动的,那么答案就不那么清楚了,这取决于驱动程序是如何工作的。在这种情况下,您的事务可能会完成,但如果函数阻塞了等待DMA中断,则根据其优先级,它可能永远不会到达。
在上述任何一种情况下,在中断中做这样的事情通常都不被认为是一个好主意。如果您使用的是RTOS,则可以使用等待信号量的高优先级任务来执行SPI事务,或者如果操作系统支持的话,可以使用延迟中断处理。如果你运行的不是实时操作系统,我会考虑是否有一种方法可以用信号通知一个较低优先级的中断(即在最低优先级使用PendSV ),或者从主进程中监控一个标志。使用较低优先级的中断,您仍然可以抢占主进程(如果需要的话),但所有其他中断都可以继续执行。如果您可以在主进程中监视一个标志,那么也可以允许您的中断继续,但是如果您受时间限制,这可能是不可能的(同样,这取决于您的应用程序的结构)
https://stackoverflow.com/questions/39521750
复制相似问题