FreeRTOS为中断提供了丰富的API(),旨在保持中断服务例程尽量的短小。此时不再在中断服务程序中进行中断的处理,而是告知任务,此时需要某个任务进行中断服务例程的后续处理任务了。缩减中断服务程序出于如下的考虑:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
鉴于我们将中断发生的事件推迟到任务中进行处理,此时需要有一个机制来实现中断与任务的同步。
当事件发生,中断服务程序发送一个二值信号来解除阻塞中的处理任务。这个二值信号可以认为是由长度为1的队列实现。由于这个队列长度为1,因此它要么是空要么是满的状态。当一个中断事件发生,中断写入二值信号量,退出中断,处于阻塞的中断延迟处理任务将二值信号量取出,执行中断延迟服务程序,并在结束后进入下一次阻塞,等待这个二值信号量。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用xSemaphoreCreateBinary()创建一个二值信号量,与队列使用相似的接口,传入的参数不同。因为是一个二值信号量,只是做为表征,无需向接口传入参数。创建二值信号量后返回这个信号量的操作句柄。
#define xSemaphoreCreateBinary()
xQueueGenericCreate((UBaseType_t) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE)
QueueHandle_t xQueueGenericCreate(const UBaseType_t uxQueueLength,
const UBaseType_t uxItemSize,
const uint8_t ucQueueType )
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用xSemaphoreTake()取出二值信号量,使用创建二值信号量时生成的句柄拿到信号量,并给出阻塞时间。
#define xSemaphoreTake(xSemaphore, xBlockTime )
xQueueSemaphoreTake((xSemaphore), (xBlockTime))
BaseType_t xQueueSemaphoreTake(QueueHandle_t xQueue,
TickType_t xTicksToWait )
使用xSemaphoreGiveFromISR()由中断给出二值信号量。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
我们可以使用计数信号量来处理反复出现且每次出现都要进行一次处理的事件,计数信号量需要在FreeRTOSConfig.h中配置宏configUSE_COUNTING_SEMAPHORES,计数信号量可以认为是由长度大于1的队列,任务并不关注这个队列中存储的数据,只关注队列中的元素的个数,计数信号量的应用场景为:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
在使用计数信号量之前,需要创建计数信号量,使用xSemaphoreCreateCounting()创建计数信号量,传入参数分别为最大的计数信号量的大小与初始的计数信号量的计数值,返回生成的信号量句柄,使用这个句柄来取出、放入信号量,取出、放入信号量的接口与二值信号量一致。
#define xSemaphoreCreateCounting(uxMaxCount, uxInitialCount)
xQueueCreateCountingSemaphore((uxMaxCount), (uxInitialCount))
QueueHandle_t xQueueCreateCountingSemaphore(const UBaseType_t uxMaxCount,
const UBaseType_t uxInitialCount )
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
队列的中断API与中断嵌套不再展开。