FreeRTOS任务间通信方式简介

信号量   :只通知接收方某个事件标志的发生,但不传递具体事件内容。该方式属于OS的API调用,可以引起任务的挂起和恢复。

消息队列:通知接收方某个事件的发生,并且告知接收方事件的内容。该方式属于OS的API调用,可以引起任务的挂起和恢复。

全局变量:可通知事件标志的发生,也可通知事件发生且传递事件内容。但该方式不属于OS的API调用,不会引起任务的挂起和恢复。任务对事件的获知,一般需要不断查询该全局变量的值是否发生变化。

       相对来说,使用信号量和消息队列进行任务间通信要比使用全局变量更加安全,对任务间通信联系变量的隔离要高。

1. 信号量:

二值信号量:属于一种同步机制,用于任务同步(信号传递)。允许在一个任务中申请,在另外一个任务中释放。

  • 任务间同步,通知某个事件发生。
  • 有且仅有两个状态:获取(Take)信号或释放(Give)信号。

互斥信号量:申请与释放要在同一个任务中进行,不能在一个任务中申请而在另一个任务中释放。用于保护共享资源。

  • 用于保护共享资源,确保在同一时刻只有一个任务能访问资源。
  • 支持任务间互斥访问,避免同时访问导致数据冲突。
  • 具有优先级继承机制,避免优先级反转问题,确保高优先级任务能够顺利获取资源。

 2. 相关函数接口:

xSemaphoreCreateBinary() 动态创建一个二值信号量。

xSemaphoreCreateBinaryStatic() 静态创建一个二值信号量。(需要预分配信号量内存,适用于内存受限条件下)

xSemaphoreGive() 释放信号量,允许其他任务或中断获取该信号量。

xSemaphoreGiveFromISR() 中断服务例程中释放信号量,使等待该信号量的任务可以被唤醒或继续执行。

xSemaphoreTake()  获取信号量,若信号量已被其他任务获取,则该任务挂起,等待信号量可用。

xSemaphoreTakeFromISR() 从中断服务例程中获取信号量。适用于从 ISR 中访问信号量或进行中断处理。

vSemaphoreDelete()  删除信号量,释放相关资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChenK21_idea

看后有收获,请赐些奶粉钱,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值