16.0-uC/OS-III同步

同步

uC/OS-III中用于同步的两种机制:信号量和事件标志组

1.信号量

信号量最初用于控制共享资源的访问。信号量可用于ISR与任
务间、任务与任务间的同步。
 

N”表示信号量可以被累计。初始化时也可以设置为非0值,
表明已经有事件发生。
ISR或任务可以提交信号量多次,信号量计数
值会记录该信号量一共可被多少次。

 

注意的是所有的信号量函数都可以被任务调用,

但是ISR中只能调用OSSemPost() 

 

函数名 功能
OSSemCreate() 创建一个信号量
OSSemDel() 删除一个信号量
OSSemPend() 等待一个信号量
OSSemPendAbort() 取消等待该信号量
OSSemPost() 提交一个信号量
OSSemSet() 设置信号量计数值

用于同步时,信号量计数值中记录了它该信号量可被分配的次数。该
计数值在
025565535, 或04294987295之间, 决定于该计数变
量的位数,
8位, 16位, 32位。特别的,信号量计数值的上限为
OS_SEM_CTR(OS_TYPE.H)
 

2.单向同步

任务可以与ISR或任务同步。 通过信号量的传递,这表明了ISR或任务发生了。

使用信号量实现同步叫做单向同步。

当任务要使用I/O端口, 它就需获得信号量而调用OSSemPend()
当任务完成对
I/O端口的访问完成后,就必须调用OSSemPost()释放
这个信号量。这个过程是单向同步的。

1)任务H被执行。该任务与ISR同步(也就是等待ISR发生),然后调用OSSemPend()申请一个信号量。

2)转向uC/OS-III函数。

3OSSemPend()的相关操作。
4)因为ISR尚未发生, 任务H被放入挂起队列, 并调用调度
器。

5)任务L被执行。
6)中断发生,任务L被保存, CPU转向ISR
7)开始执行ISR
8ISR中调用OSSemPost()提交了任务H所等待的信号量。
9)信号量被发送给任务H
10)任务H被就绪,调度器将CPU的控制权交给任务H
11)任务H获得信号量,并继续执行。

任务等待信号量时是不消耗CPU的执行时间。最后,当任务所等待的信号量出现时,

uC/OS-III能迅速地告知任务,并调用调度器。

3.信号量计数值

信号量计数值中保存了它还能被分配多少次。换句话
说,当
ISR提交该信号量n次,那么该信号量计数值就会增加n

4.多个任务等待一个信号量 

多个任务可以同时等待同样的信号量,假设每个任务都被设置了
定时期限。
 

当该信号量被提交时, uC/OS-III会让挂起队列中优先级最高的任
务就绪。 然而, 也可以让挂起队列中所有的任务被就绪, 这叫做广播
信号量,调用
OSSemPost()时选择参数OS_OPT_POST_ALL就能实
现广播的功能。
广播用于多个任务间的同步。然而,若任务还需要与不在信号量
挂起队列中的其它任务同步,可以同时使用信号量和事件标志组实现
同步的功能。

 

posted @ 2018-07-31 17:05  西贡小傻  Views(173)  Comments(0Edit  收藏  举报