第6章 信号量与互斥信号量管理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pevent
OS_EVENT
OS_EVENT_TYPE_SEM cnt
(void *) 0 0x00
76543210
.OSEventType .OSEventCnt .OSEventPtr .OSEventGrp
.OSEventTbl[]
返回ECB指针 结束
63 62 61 60 59 58 57 56 表格中所有数据均初始化为0
原则上中断和任务可以共享信号量,但并不推荐这样使用,因为信号 量一般用于任务级。如果非这样做不可,则中断服务子程序只能用来发送 信号量。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.2 建立一个信号量,OSSemCreate()
6.1.2.1 函数原型
OS_EVENT * OSSemCreate( INT16U value)
始值应该是n,并把该信号量作为一个可计数的信号量使 用。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.1.4 信号量管理函数
如表6.1所示,µC/OS-II提供了6种对信号量进行操作的函 数,所属文件是OS_SEM.C。
函数 OSSemCreate() OSSemPend() OSSemPost() OSSemAccept() OSSemDel() OSSemQuery()
三. 调用者:任务或者启动代码。 四. 配置常量:OS_SEM_EN。使用任何信号量函数的前提都是需要用此
函数建立信号量。
6.1.2.2 返回值
函数返回指向分配给所建立的信号量的事件控制块的指针。如果没 有可用的事件控制块,OSSemCreate()函数返回空指针。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
3. err 是指向包含错误码的变量的指针。OSSemPend()函数返回的错误 码可能为下述几种之一:
二. 调用者:只能是任务。 三. 配置常量:没有单独的配置常量。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
四. 函数参数:
1. pevent 是指向信号量的指针。该指针的值可以在建立该信号量时得 到;
2. timeout 指定的超时时钟节拍数量,如果一个任务在经过了timeout 参数指定的时钟节拍后还没有得到需要的信号量时,就恢复运行状态。 如果timeout为0,则表示任务将持续的等待信号量。最大的等待时间 为65,535个时钟节拍。这个时间长度并不是非常严格的,可能存在一 个时钟节拍的误差,因为只有在一个时钟节拍结束后才会减少定义的 等待超时时钟节拍。
OS_SEM_ACCEPT_EN OS_SEM_DEL_EN OS_SEM_QUERY_EN
说明
该常量为0时,屏蔽 所有信号量函数
信号量必然包含这3 个函数,所以它们 没有单独的配置常 量。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.1.6 中断、任务与信号量之间的关系
1. 一个是信号量的计数值,范围是0~65,535;
2. 另一个是由等待该信号量的任务组成的任务等待列表。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.1.2 信号量的功能
信号量可以使用在如下场合:
1. 允许一个任务与其它任务或中断同步; 2. 取得共享资源的使用权; 3. 标志事件的发生。
任务、中断服务子程序与信号量之间的关系如图6.1所示,其中:用 钥匙或者旗帜符号来表示信号量。
1. 如果信号量用于对 共享资源的访问, 那么信号量就用钥 匙符号。符号旁边 的数字N代表可用 资源数。对于二值 信号量,该值就是 1;
OSSemCreate() OSSemDel() 任务 OSSemPost()
6.1.2 建立一个信号量,OSSemCreate()
6.1.2.1 函数原型
OS_EVENT * OSSemCreate( INT16U value) reentrant
一. 功能:OSSemCreate()函数用于建立一个信号量,并对信号量赋予初 始计数值。这个初始值就是函数的参数value,可以为0~65,535中 的任何值,初始值有自己的设置规则。
四. 参数
1. pevent 指向信号量的指针,该指针的值可以在建立信号量时得到;
2. opt
定义信号量删除条件的选项,它有两个选择:
① OS_DEL_NO_PEND,规定只能在已经没有任何任务等待信号量时,才能删除 该信号量;
② OS_DEL_ALWAYS, 规定不管有没有任务在等待,立即删除这个信号量。删除 后,所有等待该信号量的任务立即进入就绪状态。
三. 返回值:OSSemCreate()函数返回指向分配给所建立的信号量的事件 控制块的指针。如果没有可用的事件控制块,OSSemCreate()函数返 回空指针。
四. 调用者:任务或者启动代码。 五. 配置常量:OS_SEM_EN。使用任何信号量函数的前提都是需要用此
函数建立信号量。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.4 等待一个信号量,OSSemPend()
6.1.4.1 函数原型
void OSSemPend(OS_EVENT *pevent,INT16U timeout,INT8U *err) reentrant
一. 功能:OSSemPend()函数挂起当前任务直到有其它的任务 或中断置位信号量或者信号量超出等待的预期时间。如果 在预期的时钟节拍内信号量被置位,μC/OS-Ⅱ默认最高 优先级的任务取得信号量并恢复执行。 当一个任务需要请求一个信号量时,就需要使用 OSSemPend()函数。 一个被OSTaskSuspend()函数挂起的任务也可以接受信 号量,但这个任务将一直保持挂起状态,直到通过调 用OSTaskResume()函数恢复任务的运行。
一. 信号量的类型
1. 一种是只有0和1两种值的信号量,称为二值信号量; 2. 另一种是可以有多种值的信号量,称为计数式信号量,其
值的大小取决于信号量的数据类型,如计数式信号量是8 位整型变量,则其值可以是0~255,若是16位整型变量, 则其值可以是0~65,535。
二. µC/OS-II信号量的两个组成部分
二. 初始值的设置规则 1. 如果信号量用来表示一个或多个事件的发生,那么该信号量的 初值通常赋为0; 2. 如果信号量用于对共享资源的访问,那么该信号量的初值应赋 为1(例如,把它当成二值信号量使用); 3. 如果信号量用来表示允许访问n个相同的资源,那么该信号量 的初值应赋为n,并把信号量作为一个可计数的信号量使用。
在使用信号量函数之前,必须将 OS_CFG.H文件中相应 的配置常量设置为0或1,以确定是编译还是裁剪该函数,其 配置常量如表6.2所示。
表6.2 信号量函数配置常量一览表
函数 系统配置
配置常量 OS_SEM_EN
OSSemCreate() OSSemPend() OSSemPost()
OSSemAccept() OSSemDel() OSSemQuery()
图6.2 信号量建立计算原理主要流程
图6.3 返回之前的ECB数据结构
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.2.4 应用范例
OSSemCreate()函数应用范例如程序清单6.2所示,必须 首先定义一个OS_EVENT类型的全局变量,用于保存函数的 返回值,以供其它相关函数使用。
程序清单6.2 OSSemCreate() 应用范例
OS_EVENT *AdcSem; void main(void) {
OSInit(); . AdcSem=OSSemCreate(1); . OSStart(); }
// 定义一个指向信号量ECB的指针 // 信号量初始值设置为1
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
一. 功能:OSSemCreate()函数用于建立一个信号量,并对信号量赋予初 始计数值。这个初始值就是函数的参数value,可以为0~65,535中 的任何值,初始值有自己的设置规则。
二. 初始值的设置规则 1. 如果信号量用来表示一个或多个事件的发生,那么该信号量的 初值通常赋为0; 2. 如果信号量用于对共享资源的访问,那么该信号量的初值应赋 为1(例如,把它当成二值信号量使用); 3. 如果信号量用来表示允许访问n个相同的资源,那么该信号量 的初值应赋为n,并把信号量作为一个可计数的信号量使用。
6.1.3 删除一个信号量,OSห้องสมุดไป่ตู้emDel()
6.1.3.1 函数原型
OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err) reentrant
一. 功能:OSSemDel()函数用于删除一个信号量。
二. 调用者:只能是任务。
三. 配置常量:OS_SEM_EN和OS_SEM_DEL_EN。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量管理
第6章 信号量与互斥信号量管理
本章主要内容 本章主要描述信号量与互斥信号 量的概念、功能、原理及其使用方法。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1 信号量管理
6.1.1 概述
6.1.1.1 信号量的类型和组成
6.1.3.3 原理
基本原理:所谓删除信号量其实质就是将信号量所属 的ECB设置恢复到它在空闲ECB链表中的原始状态,并将这 个ECB还给空闲ECB链表。
6.1.3.4 应用要点
1. 由于其它函数可能还会用到这个信号量,所有在删除信号 量之前,必须首先删除等待该信号量的所有任务;
2. 当挂起的任务进入就绪状态时,中断是关闭的,这就是说 中断延迟与等待信号量的任务的数量密切有关。
OSSemAccept() OSSemPend() OSSemQuery() 任务
或
2. 如果信号量用于表
示某事件的发生, 那么就用旗帜符号。 ISR 这时的数字N代表
N OSSemPost()
N ISR
OSSemAccept()
事件已经发生的次
数。
图6.1任务、中断服务子程序和信号量之间的关系
6.1.1.7 应用要点
6.1.2.3 原理与实现
一、原理
二、实现代码
开始
从空闲的ECB链表中取一个ECB
填写ECB数据结构中3个变量: .OSEventType <= OS_EVENT_TYPE_SEM .OSEventCnt <= cnt .OSEventPtr <= (void*)0
调OSEventWaitListInit()对等待任务列表清0
⑤ OS_ERR_PEVENT_TYPE pevent不是指向信号量的指针;
⑥ OS_ERR_PEVENT_NULL 没有可用的OS_EVENT数据结构。
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.3.2 返回值
如果信号量已被删除了,则返回空指针;若信号量没 有能被删除,则返回pevent。后一种情况下,应该查看出 错代码,以查明原因。
3. err
指向包含错误代码的变量的指针,返回值可能为下列几种之一;
① OS_NO_ERR
调用成功,信号量被删除;
② OS_ERR_DEL_ISR
试图在中断服务子程序中删除信号量;
③ OS_ERR_INVALID_OPT 参数opt不是2种合法参数之一;
④ OS_ERR_TASK_WAITING有任务在等待信号量;
6.1.1.3 对信号量的初始计数值赋值方法
对µC/OS-II信号量初始值的赋值方法如下:
1. 信号量的初始值=0~65,535。 2. 如果表示一个或者多个事件的发生,那么初始值应设为0。 3. 如果是用于对共享资源的访问,那么该初始值应设为1
(例如,把它当作二值信号量使用)。 4. 如果是用来表示允许任务访问n个相同的资源,那么该初
表6.1 信号量管理函数一览表
功能 建立信号量
调用者 任务或者启动代码
等待信号量 发送信号量
只能是任务 任务或者中断
无等待地请求信号量 删除信号量
任务或者中断 任务
查询信号量当前状态 任务或者中断
嵌入式实时操作系统μC/OS-Ⅱ教程 —— 第六章 信号量与互斥信号量
6.1.1.5 信号量的配置常量