计数信号量
二进制信号量相当于一个最多含有一个数据的队列,则计数信号量相当于可以含有多个数据的队列。任务对队列中的数据并不感兴趣,它们只关注队列中数据的个数。当FreeRTOSConfig.h中的configUSE_COUNTING_SEMAPHORES置为1时计数信号量才有效。
计数信号量主要用于两种情况:
1,计数事件,当有事件来临时就将一个信号量放入队列,从而根据队列中信号量个数来了解事件数。
2,资源管理,在这种情况下,信号量的个数表示资源个数,任务首先先获取一个信号量然后才可获取资源。当信号量用完后,资源也就为空,当任务使用好资源后,再将资源放回,并将信号量放回队列。
相关接口函数
xSemaphoreCreateCounting()
创建计数信号量,函数原型如下:
SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount,
UBaseType_t uxInitialCount );
参数:
uxMaxCount:计数信号量计数最大值。
uxInitialCount :信号量的初始计数值,若初始没有事件,则将该值设为0。
返回值:当空间不足导致失败时返回NULL,否则返回非空值。
将中断运行进程推迟到后台进程(Daemon Task)中执行
之前的中断处理例子均是需要应用层为每一个中断添加一个中断处理任务,现在我们采用接口函数xTimerPendFunctionCallFromISR()来将中断进程推迟到后台任务中执行(关于后台任务可以看软件定时器相关内容),而不用大量创建任务。
这种方法的优点:
更低的资源消耗,模型更精简。
缺点:
灵活性更低,优先级固定,通过FreeRTOSConfig.h中的configTIMER_TASK_PRIORITY来确定。
更低的决定性,xTimerPendFunctionCallFromISR()放入到队列中的执行指令将等到在它前面的指令执行完之后才执行。
接口函数
xTimerPendFunctionCallFromISR()
xTimerPendFunctionCall()的中断函数版本。函数原型如下:
BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend,
void *pvParameter1,