为什么我们将 ISR 函数与信号量一起使用?

Why do we use ISR functions with Semaphores?

您好,我刚刚开始使用带有 STM32 的 FreeRTOS。我了解使用信号量在任务或线程之间进行同步的概念。但我真正不明白的是 Semaphores/Mutexes 与中断服务例程 ISR 的结合使用。为什么我要使用 xSemaphoreGiveFromISR() 而不是只使用 xSemaphoreGive() 而它们都主要用于同步目的而不是中断。

还有软件定时器和中断有什么区别?。我知道何时以及如何使用中断,但何时需要使用软件定时器?

如果你深入研究源代码,你会发现正常与 *FromISR API 之间的区别。还有一些。它主要是一种优化,以最大限度地减少 ISR 中的执行时间(如果使用的 MCU 支持),因为 ISR 应尽可能短。 此外,ISR(调用)上下文与普通任务上下文不同,*FromISR API 会处理此问题。
这是一个实现细节 - 只需遵循记录的规则就可以了:)

基本上,软件定时器用于支持使用单个硬件定时器的 couple/many 个定时器。通常软件需要多个同时 运行 定时器,例如触发多个具有不同周期的周期性 jobs/actions,但 HW 资源(计时器)是有限的。 这也适用于使用 FreeRTOS systick 的 FreeRTOS 计时器功能,通常无论如何都会运行。

中断通常是另一回事。它们是外围硬件如何与连接的处理器交互的一种方式,其中应用程序是 运行。 好吧,例如,相应配置的 HW 计时器会触发(HW)中断以通过 ISR 触发软件以对该事件执行某些操作。

另见推荐和综合FreeRTOS documentation