首页 > 解决方案 > 为什么我们在信号量中使用 ISR 函数?

问题描述

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

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

标签: microcontrollerfreertosisr

解决方案


如果您深入研究源代码,您会发现普通 API 与 *FromISR API 之间的区别。还有几个。这主要是为了最大限度地减少 ISR 中的执行时间(如果使用的 MCU 支持)的优化,因为 ISR 应该尽可能短。此外,ISR(调用)上下文与普通任务上下文不同,*FromISR API 负责这一点。
这是一个实施细节 - 只需遵循记录在案的规则,你会没事的 :)

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

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

另请参阅推荐的综合FreeRTOS 文档


推荐阅读