信号量通常用来控制对共享资源的访问和任务同步。
二值信号量
二值信号量通常用于互斥访问或同步。二值信号量和互斥信号量很类似,互斥信号量拥有优先级继承机制,而二值信号量没有,所以二值信号量更适合用于同步。
信号量API函数同队列一样允许设置一个阻塞时间,阻塞时间是当多个任务同时获得信号量的时候优先级最大的任务优先获得信号量,这样当信号量有效的时候高优先级的任务就会解除阻塞状态。
二值信号量其实就是只有一个队列项的队列,这个队列要么是满的要么是空的只有两种状态,任务和中断使用这个特殊队列就不用在乎队列中存在的是什么消息,只需要知道这个队列是满的还是空的。可以用这个机制来完成任务和中断之间的同步。
工作过程分析
1二值信号量无效
当有二值信号是任务通过xSemaphoreTake()获得信号量,但此时二值信号无效,所以任务进入阻塞状态。
2中断释放信号量
在阻塞状态时发生了中断,在中断服务函数xSemaphoreGiveFromISR()释放信号量,所以此信号量变为有效。
3任务获得信号量
因任务获得有效的信号量,所以任务从阻塞状态解除开始执行。
4任务再次进入阻塞
在任务做完后就会再次调用函数xSemaphoreTake()获取信号量。在执行玩第三步后二值信号量就已经变为无效了所以任务再次进入阻塞状态。回到第一步无限循环。
函数
创建二值信号量
xSemaphoreCreateBinary() //创建二值信号量 使用的内存RAM是由FreeRTOS内存管理动态分配的。
此函数是个宏具体创建过