中断管理
只有以 FromISR 或 ROM_ISR 结束的API函数或宏才可以在中断服务例程中.
延迟中断处理
采用二值信号量
二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。
创建二进制信号量
vSemaphoreCreatBinary(xSemaphoreHandle xSemaphore)
FreeRTOS 中各种信号量的句柄都存储在 xSemaphoreHandle 类型的变量中。 在 使 用 信 号 量 之 前 , 必 须先 创 建 它 。 创 建 二 值 信 号 量 使 用 vSemaphoreCreateBinary()API 函数.
xSemaphore 创建的信号量.
获取信号量
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );
接收释放信号量
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );
除 互 斥 信 号 量 外 , FreeRTOS 支 持 的 其 它 类 型 的 信 号 量 都 可 以 通 过 调 用xSemaphoreGiveFromISR()给出。例程中.xSemaphoreGiveFromISR()是 xSemaphoreGive()的特殊形式,专门用于中断服务
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,portBASE_TYPE *pxHigherPriorityTaskWoken );
计数信号量
典型用法:
1,事件计数
在这种用法中,每次事件发生时,中断服务例程都会“给出(Give)”信号量——信号
量在每次被给出时其计数值加 1。延迟处理任务每处理一个任务都会”获取(Take)”一次信号量——信号量在每次被获取时其计数值减 1。信号量的计数值其实就是已发生事件的数目与已处理事件的数目之间的差值。
2,资源管理
用于资源管理的信号量,在创建时其计数值被初始化为可用资源总数.
创建一个计数信号量
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount,unsigned portBASE_TYPE uxInitialCount );
uxMaxCount 最大计数值
uxInitialCount 初始值
返回值 NULL表示内存空间不足,内存分配失败,非NULL表示创建成功
在中断服务例程中使用队列
xQueueSendToFrontFromISR(), xQueueSendToBackFromISR()与 xQueueReceiveFromISR()
分别是 xQueueSendToFront(), xQueueSendToBack()与 xQueueReceive()的中断安全版本,专门用于中断服务例程中。
信号量用于事件通信。而队列不仅可以用于事件通信,还可以用来传递数据。