在 FreeRTOS 中,不同同步机制的消息或事件传递模式(1 对 1 或 1 对多)由其设计特性决定。以下是详细分析:
1.消息队列(Queue)
● 传递模式:1V1(单播)
● 行为:每个消息只能被一个任务接收。
● 场景:
● 生产者任务向队列发送一条消息后,队列中存储该消息;消费者任务调用 xQueueReceive 取出消息后,该消息从队列中删除。
● 多生产者 + 多消费者:多个任务可同时向队列发送消息,多个任务也可同时等待接收消息,但每条消息仅被一个任务消费。
● 示例:
● 3 个传感器任务(生产者)向队列发送数据,1 个数据处理任务(消费者)读取数据。
● 每条传感器数据仅被处理一次,未被其他任务重复处理。
2.信号量(Semaphore)
● 传递模式:
● 二进制信号量:1V1
● 行为:释放信号量后,仅唤醒一个等待任务(优先级最高或等待时间最长的任务)。
● 场景:中断服务程序(ISR)释放信号量,通知一个任务处理事件(如数据接收完成)。
● 计数信号量:1Vn(有限多播)
● 行为:每次释放信号量增加计数值,允许多个任务获取信号量(每个任务获取后计数值减 1)。
● 场景:管理多个共享资源(如缓冲池中的 5 个缓冲区,多个任务可并发申请使用)。
3. 事件组(Event Group)
● 传递模式:1Vn(广播)
●本质:位掩码(bitmask),允许任务等待多个事件中的任意组合(逻辑与/或)。
●特性:每个事件对应一个位(如BIT0表示“按键按下”,BIT1表示“数据接收完成”)。
●支持多任务同时等待和设置事件。
● 行为:设置事件位后,所有等待该事件位的任务(满足条件)均被唤醒。
● 场景:
● 一个任务设置事件位 BIT0(如“网络连接成功”),多个等待 BIT0 的任务同时被触发。
● 任务可等待多个事件位的组合(如 BIT0 | BIT1),满足逻辑条件时触发。
4. 任务通知(Task Notification)
● 传递模式:1V1(严格单播)
●本质:直接向任务发送通知(类似轻量级信号量或事件),无需创建额外对象。
●特性:每个任务自带一个通知值(32位)和一个通知状态(pending/not pending)。
○支持计数器模式(模拟计数信号量)或位掩码模式(模拟事件组)。
○轻量高效:比队列或信号量节省内存,速度更快。
● 行为:通知直接发送给指定任务,仅该任务可接收通知。
● 场景:
● 中断向特定任务发送通知(如“定时器超时”),无需全局信号量或队列。
● 轻量级同步场景,替代二进制信号量(如任务间一对一事件触发)。
5.对比总结

关键区别
- 广播能力:
● 只有事件组支持 1Vn 广播,其他机制均为 1V1 或有限多播。 - 资源占用:
● 任务通知最轻量,无需创建额外对象;事件组和队列需显式分配内存。 - 灵活性:
● 队列支持复杂数据传输,事件组支持多条件逻辑组合,信号量专注资源管理。
通过合理选择机制,可优化系统的实时性、内存占用和代码可维护性。
1942

被折叠的 条评论
为什么被折叠?



