05 FreeRTOS 信号量(semaphore)

1、信号量的特性

        队列可以用于传输数据:在任务之间、任务和中断之间。而有时候我们只需要传递状态,并不需要传递具体的信息,在这种情况下,我们可以使用信号量(semaphore),它更节省内存。

1.1 什么是信号量

        信号:起通知作用

        量:还可以用来表示资源的数量,当""没有限制时,它就是"计数型信号量"(Counting Semaphores),当""只有01两个取值时,它就是"二进制信号量"(Binary Semaphores)。

        支持的动作:"give"给出资源,计数值加1"take"获得资源,计数值减1

        计数型信号量的典型场景:

                计数:事件产生时"give"信号量,让计数值加1;处理事件时要先"take"信号量,就是获得信号量, 让计数值减1

                资源管理:要想访问资源需要先"take"信号量,让计数值减1;用完资源后"give"信号量,让计数值 加1

        信号量的"give""take"双方并不需要相同,可以用于生产者-消费者场合:

                生产者为任务A

FreeRTOS信号量是一种用于线程间通信和同步的机制,它可以帮助我们管理资源访问、协调任务之间的操作等。在嵌入式系统开发中非常有用。 FreeRTOS支持多种类型的信号量: 1. **二值信号量(Binary Semaphore)**:类似于互斥锁(mutex),只能取两个值0或1,通常用来保护临界区或者表示某个事件的发生与否; 2. **计数型信号量(Counting Semaphore)**:可以有多个可用状态,从最小值到最大值之间变化,常用于控制对有限数量资源共享的访问; 3. **互斥型信号量(Mutex)**:主要用于防止多个任务同时进入一段关键代码区域,并且保证持有者优先原则(即拥有该mutex的任务如果再次请求获取,则直接获得而不需等待)。 当你提到"freertos信号量in", 如果是指如何创建并初始化一个信号量的话,在FreeRTOS里你可以通过调用`xSemaphoreCreateBinary()`, `xSemaphoreCreateCounting()` 或者 `xSemaphoreCreateMutex()` 来完成对应类型信号量实例化工作。之后就可以利用如`xSemaphoreTake()`,`xSemaphoreGive()` 等API来进行实际的操作了。 下面是一个简单的例子展示怎样声明以及使用二值信号量: ```c // 创建一个二值信号量句柄变量 SemaphoreHandle_t xBinarySemaphore; void setup(){ // 初始化这个二值信号量 xBinarySemaphore = xSemaphoreCreateBinary(); } void loopTask(void * parameter){ if(xSemaphoreTake(xBinarySemaphore,portMAX_DELAY)){ // 成功拿到信号量后在此处执行受保护的关键部分... // 操作完成后释放信号量让其他任务有机会取得 xSemaphoreGive(xBinarySemaphore); } } ``` 以上就是关于FreeRTOS信号量的一些基本介绍啦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值