Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM Cortex-M4中断优先级_Arm_Spi_Cortex M_Irq - Fatal编程技术网

ARM Cortex-M4中断优先级

ARM Cortex-M4中断优先级,arm,spi,cortex-m,irq,Arm,Spi,Cortex M,Irq,我用的是ARM Cortex M4单片机。如果我有一个优先级为2的GPIO的中断处理程序和一个优先级为3的SPI驱动程序(即优先级低于GPIO),并且我从GPIO的中断处理程序中调用一个(阻塞)SPI读取,SPI函数会工作吗?您的问题的答案取决于它是如何阻塞以处理传输的,正如@Notlikethat所说的 如果您的SPI驱动程序是轮询驱动程序,那么它很可能会工作。在这种情况下,GPIO中断将在SPI外围设备内的标志上旋转,等待传输的每个部分完成 如果您的SPI驱动程序是中断驱动的,那么它将无法工

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

您的问题的答案取决于它是如何阻塞以处理传输的,正如@Notlikethat所说的

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

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

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


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

取决于所述函数是轮询SPI控制器还是等待中断到达…阻塞读取在中断处理程序中(或阻止任何东西)是一个非常糟糕的主意。中断应该总是尽可能快。我使用的MCU是一个没有RTOS的北欧nRF52。问题是我(将)我有一个SPI传感器,它每4ms准备一次数据,每次中断时SPI都会读取数据并将其存储在缓冲区中。读取大量样本后,将对数据进行处理。处理预计需要10ms。因此,预计还会有2个样本准备好并存储(到双缓冲区)在处理过程中。由于没有RTO,我需要以某种方式让新的数据读取中断抢占处理处理程序。continued因此,我考虑让SPI读取直接发生在GPIO中断处理程序中,以便数据处理功能可以从main运行(优先级较低)。最简单(且健壮)的是什么解决方法?谢谢!根据你刚才给我的数字,听起来你跟不上。如果每4毫秒,你将有需要10毫秒处理的新数据,1秒钟后,你将有150个样本的备份日志尚未处理。处理发生在什么上下文中?是在某个中断中,还是在某个中断中在主进程中?嗨,rjp,对不起,我不清楚..“读取大量样本后”意味着在100个样本之后,即400ms@4ms/S,处理100S数据。因此,我担心的是在处理事件期间缺少两次样本读取。处理事件将在主上下文中发生(最低)通过一个标志指示数据已准备好进行处理。GPIO中断是否需要比SPI中断具有更高的优先级?