快速体验FreeRTOS所有常用API(1)工程创建
快速体验FreeRTOS所有常用API(2)任务管理
快速体验FreeRTOS所有常用API(3)同步与互斥
快速体验FreeRTOS所有常用API(4)队列
快速体验FreeRTOS所有常用API(5)信号量、互斥量
快速体验FreeRTOS所有常用API(6)事件组
快速体验FreeRTOS所有常用API(7)任务通知
快速体验FreeRTOS所有常用API(8)软件定时器
快速体验FreeRTOS所有常用API(9)中断管理
快速体验FreeRTOS所有常用API(10)资源管理
快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比
三、同步和互斥
3.1 同步(Sync)
- 定义: 同步是一种协调多个线程或进程之间执行顺序的机制。它确保在多个并发实体之间按照预定的顺序执行操作,以避免不确定的行为。
- 目的: 防止因为执行顺序不确定而导致的问题。
- 实现方式: 同步机制包括使用信号量(Semaphores)、事件组(event group)、任务通知(task notification)等。
3.2 互斥(Mutex)
- 定义: 互斥是一种用于控制对共享资源访问的机制。它确保在任何时刻只有一个线程或进程能够访问共享资源,从而避免竞态条件。
- 目的: 防止多个线程或进程同时修改共享资源,保护共享资源的一致性。
- 实现方式: 互斥锁是常见的互斥机制,通过在关键部分代码前后加锁和解锁来实现。在访问共享资源时,一个线程获得互斥锁,其他线程需要等待锁释放才能访问。
3.3 总结
- 队列(queue)、信号量(semaphoe)、互斥量(mutex)、事件组(event group)、任务通知(task notification),都能实现同步、互斥。总结括它们的联系、区别以及在使用时的如何选择。
1)需要记忆的一些浓缩点:
1 队列
用途:数据传递
重要参数:长度、数据类型
常见操作:写队列、读队列
2 信号量
用途:资源计数
重要参数:计数值
常见操作:获取信号量、释放信号量
3 互斥量
用途:互斥(共享资源保护)
重要参数:无
常见操作:获取互斥量、释放互斥量
4 事件组
用途:多事件同步
重要参数:事件位
常见操作:设置事件、等待事件
5 任务通知
用途:轻量级通信
重要参数:无
常见操作:发送通知、等待通知
2)对比
内核机制 | 生产者 | 消费者 | 传送的内容 | 用途 |
---|---|---|---|---|
队列 | All Task | All Task | 数据 | 数据传输 |
信号量 | All Task | All Task | 状态 | 资源计数 |
互斥量 | 当前任务 | 当前任务 | 状态 | 资源保护 |
事件组 | All Task | All Task | 状态 | 多事件同步 |
任务通知 | All Task | 当前任务 | 状态/数据 | 轻量级通信 |
1 用途不同:
- 队列: 用于任务之间的数据传递。
- 信号量: 用于控制对共享资源的访问,限制访问数量。
- 互斥量: 用于确保在任何时刻只有一个线程能够访问共享资源。
- 事件组: 用于更复杂的同步和通信需求,涉及多个事件状态。
- 任务通知: 用于实现轻量级的任务间通信,例如唤醒任务等。
2 内容传送:
- 队列: 可以传送各种数据类型。
- 信号量、互斥量、事件组、任务通知: 主要用于控制和通知,本身不传送数据。
3 阻塞机制:
- 队列: 队列满时生产者阻塞,队列空时消费者阻塞。
- 信号量、互斥量、事件组、任务通知: 都支持阻塞和非阻塞操作。