microcontroller - 为什么我们在信号量中使用 ISR 函数?
问题描述
您好,我刚刚开始使用带有 STM32 的 FreeRTOS。我理解使用信号量的任务或线程之间同步的概念。但我真正不明白的是Semaphores
/Mutexes
与 Interrupt Service Routine的使用ISR
。为什么我要使用xSemaphoreGiveFromISR()
而不是仅仅使用xSemaphoreGive()
,而它们都主要用于同步目的而不是中断。
另外,软件定时器和中断之间有什么区别?我知道何时以及如何使用中断,但何时需要使用软件定时器?
解决方案
如果您深入研究源代码,您会发现普通 API 与 *FromISR API 之间的区别。还有几个。这主要是为了最大限度地减少 ISR 中的执行时间(如果使用的 MCU 支持)的优化,因为 ISR 应该尽可能短。此外,ISR(调用)上下文与普通任务上下文不同,*FromISR API 负责这一点。
这是一个实施细节 - 只需遵循记录在案的规则,你会没事的 :)
基本上,软件定时器用于支持使用单个硬件定时器的几个/多个定时器。软件通常需要多个同时运行的计时器,例如触发多个具有不同周期的周期性作业/操作,但硬件资源(计时器)是有限的。这也适用于使用 FreeRTOS systick 的 FreeRTOS 计时器功能,该系统通常无论如何都会运行。
一般来说,中断是另一回事。它们是外围硬件如何与运行应用程序的连接处理器交互的一种方式。好吧,例如,相应配置的硬件定时器会触发(硬件)中断,以通过 ISR 触发软件对该事件执行某些操作。
另请参阅推荐的综合FreeRTOS 文档。
推荐阅读
- java - Java 按字母顺序对 ArrayList 中的 ArrayList 进行排序
- javascript - 从原始日期计算工作日
- android - mapView 在 android 中无法正确显示
- database - MongoDB:在文档中移动元素
- ios - Firemonkey iOS CFBundleExecutable错误部署应用程序
- regex - 正则表达式中异或(XOR)的第二个条件
- iterator - Python链迭代
- swift - 如何在 Xcode 中将图像与字符串相关联?
- java - 为什么不使用 Last Commit 构建 TeamCity 项目?
- c# - 如何在列表 c# 中的所有元素上运行方法以缩短加载时间