C 我应该在中断例程中检索SPI数据吗?

C 我应该在中断例程中检索SPI数据吗?,c,freertos,esp32,C,Freertos,Esp32,我使用esp32作为spi主机,带有24位ADC,使用spi传输数据。ADC通过降低连接至esp32的IO引脚指示新样本已准备就绪。这个SPI事务应该直接在gpio中断处理程序中完成还是在主循环中完成?我想在中断处理程序中设置一个标志来指示新样本已准备就绪,然后在主循环中不断检查该标志。我以前就是这样做的,因为我一直担心中断例程花费太长时间。当您使用freeRTOS时,您应该有一个从ADC读取数据的任务。中断例程应该只通知读卡器任务(最有效的方法是使用直接任务通知)。因此,在这种情况下,您的方法

我使用esp32作为spi主机,带有24位ADC,使用spi传输数据。ADC通过降低连接至esp32的IO引脚指示新样本已准备就绪。这个SPI事务应该直接在gpio中断处理程序中完成还是在主循环中完成?我想在中断处理程序中设置一个标志来指示新样本已准备就绪,然后在主循环中不断检查该标志。我以前就是这样做的,因为我一直担心中断例程花费太长时间。

当您使用freeRTOS时,您应该有一个从ADC读取数据的任务。中断例程应该只通知读卡器任务(最有效的方法是使用直接任务通知)。因此,在这种情况下,您的方法都不正确。

您应该在中断处理程序中尽可能少地执行操作。无论您使用的是什么平台或操作系统,这一点基本上都是正确的

非中断级代码必须锁定中断,以确保数据结构和I/O不受中断处理程序的干扰

例如,在您的例子中,您询问是否应该在中断处理程序中启动SPI事务。如果这样做,为了安全起见,您需要确保在中断处理程序之外使用SPI的任何地方都能锁定中断。否则,如果发生中断,并且您在SPI库也在中断处理程序之外执行时调用SPI库,则可能会导致SPI库或通过SPI访问的硬件中出现不一致的状态

数据结构也是如此。假设您在中断处理程序外部保留一个使用的链表,并在中断处理程序内部向其添加内容。如果中断发生在错误的时间,则会损坏列表结构,除非在操作或遍历时锁定中断

您希望尽可能减少锁定中断的时间-锁定中断可能会干扰计时并导致数据丢失

这意味着您最好在中断处理程序中做尽可能少的工作。这样就不需要锁定it之外的中断,而且不会错过中断或丢失数据,而且如果忘记锁定代码重要部分的中断,也不会有损坏数据结构或使I/O硬件处于不一致状态的风险

我们通常使用一个称为“信号量”的简单变量来指示中断发生。中断处理程序可以增加信号量,而非中断级处理代码可以减少信号量。只要编译器能够在一条指令中管理信号量,它就不会被损坏

在C中,我们需要将信号量变量声明为
volatile
,这让C编译器知道它可能随时发生变化。然后,编译器生成的代码不依赖于变量的值在操作之间保持不变

volatile int got_interrupt = 0;

中断处理程序将简单地递增
got\u interrupt
,在中断处理程序外部运行的代码将检查它,如果它不为零,则将递减它并采取所需的任何操作(在您的情况下,调用SPI库)。

这取决于您以及它是否适合您尝试执行的操作。您应该理解ISR耗时太长的原因,并查看原因是否适用于您的案例。请向我们展示一些代码示例,以便更好地理解问题。