第五章 信号量

℡╲_俬逩灬. 提交于 2019-11-28 05:52:07

简介:

信号量用来进行资源管理和任务同步。

FreeRTOS 中 信号量分为  二值信号量,互斥信号量,计数信号量和递归信号量。

二值信号量

        官网介绍:https://www.freertos.org/Embedded-RTOS-Binary-Semaphores.html

        一个只有一个队列项的队列。 可以用于互斥访问 或者 同步,常用于任务(中断)和任务间的同步。

        函数

        创建二值信号量       xSemaphoreCreateBinary()

        释放信号量              xSemaphoreGive()

        获取信号量                xSemaphoreTake()

 

计数信号量

        官网介绍:https://www.freertos.org/Real-time-embedded-RTOS-Counting-Semaphores.html

        简介: 计数信号量是长度大于1的队列。

        一 个二值信号量最多只可以锁存一个中断事件。在锁存的事件还未被处理之前,如果还有中断事件发生,那么后续发生的中断事件将会丢失。如果 用计数信号量代替二值信号量,那么,这种丢中断的情形将可以避免。

 

        常用与两个场合:

  1. 计算事件。

    在这种使用场景中,事件处理程序将在每次事件发生时“给出”信号量(递增信号量计数值),并且处理程序任务将在每次处理事件时“获取”信号量(递减信号量计数值)。因此,计数值是已发生事件数与已处理数之间的差值。在这种情况下,希望在创建信号量时计数值为零。

           应用场景: 某个动作触发计数信号量,信号量的值都会+1.另一个任务会根据计数信号量的计数值,发生多次触发事件。

  1. 资源管理。

           在此使用方案中,计数值指示可用资源的数量。要获得对资源的控制,任务必须首先获得信号量 - 递减信号量计数值。当计数值达到零时,没有空闲资源。当任务完成资源时,它'返回'信号量 - 增加信号量计数值。在这种情况下,希望计数值等于创建信号量时的最大计数值。

应用场景: 做流控 。 比如银行有10个窗口,排号机人员排号。停车场空位。

 

        函数:

互斥信号量

        官网介绍: https://www.freertos.org/Real-time-embedded-RTOS-mutexes.html

        一个拥有优先级继承的二值信号量。互斥信号量相当于一个钥匙,要访问的时候,必须需要钥匙,访问完了之后,需要归还钥匙,这样其他的任务可以拿这个钥匙去使用资源。

        互斥信号量,只能用在任务中,不能用于中断服务函数。

        互斥信号量创建成功后,释放了一次。这里和二值信号量不同,二值信号量创建的时候,没有释放。

        函数:

        创建                          xSemaphoreCreateMutex()

        释放信号量               xSemaphoreGive()

         获取信号量                xSemaphoreTake()

递归互斥信号量

        官网: https://www.freertos.org/RTOS-Recursive-Mutexes.html

        不能用在中断服务函数中。

       递归使用的互斥锁可由所有者重复“捕获”。

        创建:  xSem'CreateRecursiveMutex()

        释放:    xSemaphoreGiveRecursive()

        获取:    xSemaphoreTakeRecursive()

 

 

        

 

使用信号量,要包含头文件 #include "semphr.h"

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!