当前位置: 代码迷 >> 综合 >> ucos-iii学习之同步
  详细解决方案

ucos-iii学习之同步

热度:93   发布时间:2023-09-19 06:33:53.0

uC/OS-III 中用于同步的两种机制:信号量和事件标志组。
1.信号量
信号量可用于ISR与人物间,任务与任务间的同步。

信号量API
ucos-iii学习之同步

(1)单向同步
通过信号量实现同步叫做单向同步。
当任务要使用 I/O 端口,它就需获得信号量而调用 OSSemPend()。
当任务完成对 I/O 端口的访问完成后,就必须调用 OSSemPost()释放 这个信号量。
(2)信号量计数值
信号量计数值中保存了它还能被分配多少次。
当 ISR 提交该信号量 n 次,那么该信号量计数值就会增加 n。
(3)多个任务等待一个信号量
当信号量被提交时,会让挂起队列中优先级最高的任务就绪。
也可以让挂起队列中所有的任务被就绪,这叫做广播信号量。
2.任务內建信号量
经常通过发送信号量实现同步。每个任务都有内建的信号量,通过任务内建的信号量不仅可以简化信号量通信的代码而且更加有效。

任务內建信号量API
ucos-iii学习之同步

(1)挂起任务信号量
当任务被创建时,也会内建一个信号量。
(2)提交任务信号量
ISR 或任务通过调用 OSTaskSemPost()提交任务信号量。
(3)双向同步
两个任务间可以用两个信号量实现双向同步。
3.事件标志组
当任务要与多个事件同步时可以使用事件标志。若其中的任意一个事件发生时任务被就绪,叫做逻辑或(OR)。若所有的事件都发生时任务被就绪,叫做逻辑与(AND)。
用户可以创建任意个事件标志组(限制于 RAM)。

事件标志组API
ucos-iii学习之同步

(1)使用事件标志组
当任务或 ISR 提交标志到事件标志组,满足条件的任务会被就绪。
事件标志组中位的含义由用户定义,应用中可以有多个事件标志组。
(2)事件标志组内部结构

4.多任务同步
通过广播信号量实现多任务同步是通用的方法。
5.总结
有三种方法可以让 ISR 或任务标记另一个(多个)任务:信号量、任务信号量、事件标志组。
信号量和任务信号量中都有信号量计数值表示该信号量还可以被分配几次。若 ISR 或任务需要标记一个任务时,推荐使用任务信号量因为这可以避免定义一个外部信号量且更为有效。
当任务需要与一个或多个事件同步时使用事件标志组。