没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
实验
4
基于
uC/OS-
Ⅱ的任务间通信与同步实验
摘要:实验
3
进行了
uC/OS
任务创建的相关操作,但是没有进行任务间的通信
和协调,因此本次实验在实验
3
的基础上进行信号量和邮箱的重点学习和实验,
实现了通过信号量使任务达到同步和协调,形成触发机制。通过使用邮箱实现任
务间信息的传递。另外本次实验给出了简明的信号量和邮箱的使用流程和实现代
码,并进行了分析和总结。
1
基础知识
1.1 信号量
信号量由两部分组成:一部分是 16 位的无符号整型信号量的计数值。另一
部分是由等待该信号量的任务组成的等待任务表。
信号量用于对共享资源的访问,用钥匙符号,符号旁数字代表可用资源数,
对于二值信号量该值为 1。
信号量还可用于表示某事件的发生,用旗帜符号表示,符号旁数字代表事件
已经发生的次数。
提供服务:
OSSemCreate(),建立一个信号量,对信号量赋予初始计数值。
如信号量是用于表示一个或多个事件的发生的,其初始值通常为 0。
如信号量用于对共享资源的访问,则该值赋为 1。
如信号量用于表示允许任务访问 n 个相同的资源,则该值赋为 n,并把该信
号量作为一个可计数的信号量使用。
OSSemDel(),删除一个信号量,在删除信号量前必须首先删除操作该信号
量的所有任务。
OSSemPend(),等待一个信号量。
OSSemPost(),发出一个信号量。
OSSemAccept(),无等待地请求一个信号量。
OSSemQuery(),查询一个信号量的当前状态。
不推荐任务和中断服务子程序共享信号量,因为信号量一般用于任务级。
如果确实要在任务和中断服务子程序中传递信号量,则中断服务子程序只能
发送信号量。
OSSemDel()和 OSSemPend()服务不能被中断服务子程序调用。
图 1.1 任务、中断服务子程序和信号量之间的关系
1.2
互斥型信号量(
mutex
)
互斥型信号量用于处理共享资源。
由于终端硬件平台的某些实现特性,例如单片机管脚的复用,多个任务需要
对硬件资源进行独占式访问。所谓独占式访问,指在任意时刻只能有一个任务访
问和控制某个资源,而且必须等到该任务访问完成后释放该资源,其他任务才能
对此资源进行访问。
操作系统进行任务切换时,可能被切换的低优先级任务正在对某个共享资源
进行独占式访问,而任务切换后运行的高优先级任务需要使用此共享资源,此时
会出现优先级反转的问题。即,高优先级的任务需要等待低优先级的任务继续运
行直到释放该共享资源,高优先级的任务才可以获得共享资源继续运行。
可以在应用程序中利用互斥型信号量(mutex)解决优先级反转问题。互斥
型信号量是二值信号量。由于 uC/OS-II 不支持多任务处于同一优先级,可以把
占有 mutex 的低优先级任务的优先级提高到略高于等待 mutex 的高优先级任务的
优先级。等到低优先级任务使用完共享资源后,调用 OSMutexPost() ,将低优先
级任务的优先级恢复到原来的水平。
互斥型信号量(mutex)的操作:
建立一个互斥型信号量 OSMutexCreate (INT8U prio, INT8U *err)
等待一个互斥型信号量(挂起)
OSMutexPend (OS_EVENT * pevent, INT16U timeout, INT8U * err )
释放一个互斥型信号量 OSMutexPost (OS_EVENT * pevent)
互斥型信号量应用:优先级反转问题。
优先级反转问题发生于高优先级的任务需要使用某共享资源,而该资源已被
一个低优先级的任务占用的情况。
为了降解优先级反转,内核可以将低优先级任务的优先级提升到高于高优先
级任务的优先级,直到低优先级的任务使用完占用的共享资源。
图 1.2 互斥信号量解决优先级翻转
优先级继承优先级 PIP(Priority Inheritance Protocol,优先级继承协议的基本
思想是当更高优先级的进程
Ji
被进程
Jk
阻塞时,
Jk
暂时继承
Ji
的优先级,这将
防止中间优先级的进程抢占进程
Jk
使高优先级进程
Ji
的阻塞时间延长),略高
于最高优先级任务的优先级。
例:
OSMutexCreate(9,&err)
。建立互斥型信号量,
9
为
PIP
。
其它服务:
OSMutexDel
(),删除互斥型信号量,在删除信号量之前应先删除可能用
到该信号量的所有任务。
OSMutexPend
(),等待一个互斥型信号量(挂起),定义超时值为
0
时则
无限期等待。
OSMutexPost
(),释放一个互斥型信号量。
OSMutexAccept
(),无等待地获取互斥型信号量(不挂起)。
OSMutexQuery
(),获取互斥型信号量的当前状态。
所有服务只能用于任务与任务之间,不能用于任务与中断服务子程序之间。
图
1.3
任务与互斥型信号量之间的关系
1.3 事件标志组( event flag)
事件标志组由 2 部分组成:一是保存各事件状态的标志位。二是等待这些标
志位置位或清除的任务列表。可以用 8 位、16 位或 32 位的序列表示事件标志组,
每一位表示一个事件的发生。
要 使 系 统 支 持 事 件 标 志 组 功 能 , 需 要 在 OS_CFG.H 文 件 中 打 开
OS_FLAG_EN 选项。
应用场合: 如果一个任务需要等待多个事件的同时发生或者多个事件的中
的某个事件发生才能转为就绪态,就可以考虑事件标志组进行任务的同步通信。
操作集合:
OSFlagCreate(),建立一个事件标志组。
事件标志组数据结构包括:指针类型,等待事件标志组的任务列表,以及表
明当前事件标志状态的位。
OSFlagDel(),删除一个事件标志组,在删除事件标志组前必须首先删除操
作该事件标志组的所有任务。
OSFlagPend(),等待事件标志组的事件标志位。
OSFlagPost(),置位或清 0 事件标志组中的事件标志。
OSFlagAccept(),无等待地获得事件标志组中的事件标志,可以被 ISR 调用。
OSFlagQuery(),查询事件标志组的状态。
其中 OSFlagCreate()、OSFlagDel()、OSFlagPend()只能被任务调用,不能被
中断调用。其它服务任务和中断都可调用。
剩余14页未读,继续阅读
资源评论
信雪神话
- 粉丝: 145
- 资源: 15
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功