FreeRTOS中断管理(一)

二值信号量

  • 二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)中只是快速处理少部分工作。如此,中断处理可以说是被“推迟”(deferred)到一个“处理”(handler)任务。
  • 如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,以保证延迟处理任务随时都可以抢占系统中的其他任务。这样,延迟处理任务就成为其对应的ISR退出后第一个执行的任务,在时间上紧接着ISR执行,相当于所有的处理都在ISR中完成一样
    FreeRTOS中断管理(一)_第1张图片
  • 延迟处理任务对一个信号量进行带阻塞性质的"take"调用,意思是进入阻塞态以等待事件发生。当事件发生后,ISR对同一个信号量进行"give"操作,使得延迟处理任务解除阻塞,从而事件在延迟处理任务中得到相应的处理。
  • 信号量可以看做一个深度为1的队列。这个队列由于最多只能保存一个数据单元,所以其不为空则为满(所谓“二值”)。
  • 延迟处理任务调用xSemaphoreTake()时,等效于带阻塞时间地读取队列,如果队列为空的话任务则进入阻塞态
  • 当事件发生后,ISR通过调用xSemaphoreGiveFromISR()放置一个信号量到队列中,使得队列成为满状态。这也使得延迟处理任务切出阻塞态,并移除信号量,使得队列再次成为空。当任务完成处理后,再次读取队列,发现队列为空,又进入阻塞态,等待下一次事件发生
    FreeRTOS中断管理(一)_第2张图片

vSemaphoreCreateBinary()

#define vSemaphoreCreateBinary( xSemaphore )//创建二值信号量

在这里插入图片描述

xSemaphoreTake()

#define xSemaphoreTake( xSemaphore, xBlockTime )//获取信号量

FreeRTOS中断管理(一)_第3张图片

  • 除互斥信号量外,所有类型的信号量都可以通过调用函数xSemaphoreTake()来获取
  • 不能在中断服务例程中调用。

xSemaphoreGiveFromISR()

#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )

FreeRTOS中断管理(一)_第4张图片

对任务和中断进行同步

FreeRTOS中断管理(一)_第5张图片
FreeRTOS中断管理(一)_第6张图片
FreeRTOS中断管理(一)_第7张图片
FreeRTOS中断管理(一)_第8张图片
FreeRTOS中断管理(一)_第9张图片
整个执行流程可以描述为:

1)中断产生。

2)中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。

3)当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是获取信号量。

4)延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效,任务将切入阻塞待等待事件发生。

你可能感兴趣的:(嵌入式)