一、中断管理
1.延迟中断处理
(1)采用二值信号量同步
二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR) 中只是快速处理少部份工作。如此,中断处理可以说是被”推迟(deferred)”到一个”处理 (handler)”任务。
如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,以保证延迟处理任务随时都抢占系统中的其它任务。这样,延迟处理任务就成为其对应的ISR退出后第一个执行的任务,在时间上紧接着ISR执行,相当于所有的处理都在ISR中完成一样。
vSemaphoreCreateBinary() API 函数
#define vSemaphoreCreateBinary( xSemaphore )
xSemaphore 创建的信号量
xSemaphoreTake() API 函数
#define xSemaphoreTake( xSemaphore, xBlockTime )
xSemaphore 获取得到的信号量
xTicksToWait FreeRTOS 阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。如果xTicksToWait为0,则xSemaphoreTake()在信号量无效时会立即返回。
“带走(Taking)”一个信号量意为”获取(Obtain)”或”接收(Receive)”信号量。只有当信号量有效的时候才可以被获取。在经典信号量术中,xSemaphoreTake()等同于一次P()操作。除互斥信号量(Recursive Semaphore,直译为递归信号量,按通常的说法译为互斥信号量)外,所有类型的信号量都可以调用函数xSemaphoreTake()来获取。
但xSemaphoreTake()不能在中断服务例程中调用。
xSemaphoreGiveFromISR() API 函数
除互斥信号量外,FreeRTOS支持的其它类型的信号量都可以通过调用xSemaphoreGiveFromISR()给出。SemaphoreGiveFromISR()是xSemaphoreGive()的特殊形式,专门用于中断服务例程中。
xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )
xSemaphoreCreateCounting() API 函数
FreeRTOS 中所有种类的信号量句柄都由声明为xSemaphoreHandle 类型的变量 保存。 信号量在使用前必须先被创建。使用xSemaphoreCreateCounting() API 函数来创 建一个计数信号量。
xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )
(2)在中断服务例程中使用队列
xQueueSendToFrontFromISR(),xQueueSendToBackFromISR()与xQueueReceiveFromISR()分别是xQueueSendToFront(),xQueueSendToBack()与xQueueReceive()的中断安全版本,专门用于中断服务例程中。
信号量用于事件通信。而队列不仅可以用于事件通信,还可以用来传递数据。
xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken )
xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken )