当前位置:文档之家› 操作系统6(内核对象)

操作系统6(内核对象)


在共享资源时,只有任务可以使用信号量,中断服务程 序不能使用。
3
电子与信息工程学院
信号量是一种内核对象,定义在数据结构os_sem.c中, 其数据类型为OS_SEM。
函数名 OSSemCreate() OSSemDel() OSSemPend() OSSemPendAbort() OSSemPost() OSSemSet()
29
电子与信息工程学院
任务和ISR都可以发布事件标志。但只有任务可以创建、 删除事件标志组以及取消其他任务对事件标志组的等待。
任务可以等待事件标志组中的任意个事件标志,如果等 待超时,那么任务则进入就绪态。
函数名 OSFlagCreate() OSFlagDel() OSFlagPend() OSFlagPendAbort() OSFlagPendGetFlagsRdy() OSFlagPost()
11
电子与信息工程学院
信号量使用注意事项 1)访问共享资源时引入信号量并不会增加系统的中断延迟。 2)程序中可以使用任意多的信号量来保护各种资源。 3)请求和释放信号量的过程是相当耗费时间的。 4)实时系统中使用信号量有可能导致一个严重问题——优 先级反转。
12
1、信号量
1.2内部结构
电子与信息工程学院
任务可以设定等待的事件的“或”、“与”的机制。
32
电子与信息工程学院
定义事件标志组的 位。
该程序中定义了一 个类型为OS_FLAG_GRP 的MyEventFlagGrp的变 量。
创建名为“My Event Flag Group”的 事件标志组,并且将该 标志组中所有的位定义 为0。
等待事件标志组
.RdyObjPtr 在任务等待多个内核对象的情况下,指向已经准备就 绪的内核对象。 .RdyMsgPtr 在任务等待多个内核对象的情况下,指向通过 OSQPost()函数发布 信息。 .RdyTS 时间戳,记录内核对象被释放(post)的时刻,用于任16务 等待多个内核对象的情况。
两 个 任 务 同 时 等 待 一 个 信 号 量。
15
电子与信息工程学院
.PrevPtr 指向的是等待该内核对象的更高或相同 优先级的任务。 .NextPtr 指向的是等待该内核对象的较低或相同 优先级的任务。 .TCBPtr 指向等待该内核对象的任务的控制块 OS_TCB。 .PendObjPtr 指向任务正在等待的内核对象,内 核对象可能是一个信号量、互斥信号量、事件标 志组或者消息队列,这些内核对象有一个共同的 数据结构。
3、如果使用信号量来进行系统资源管理,那么信号量的初值应 该设置为该信号量所对应的系统资源数目。如果信号量仅用于 信号机制,则该值应该设置为0.
4、即便用户了解了OS_SEM数据类型的内部细节,程序代码也决
不能直接访问器数据结构的内部成员,而是应该使用系统提供
的API函数。
18
1、信号量
电子与信息工程学院









|
|




9
OS_SEM mysem1; OS_SEM mysem2;
Main() {
OS_ERR err; OSInit(&err); …… OSSemCreate(&mysem1,
“mysem1”, 0, &err); OSSemCreate(&mysem2, “mysem2”, 0, &err); …… OSTaskCreate(……); …… OSStart(&err); …… }
任务务使或用I阻S塞R管型理等的待。,
响并应且这要些“状消态费信掉息”
的该任事务件可标通志过。调用
非阻塞式等待函数
来监控相关的事件
34
标志。
指定向哪个 事件标志组发布 事件标志。
指定ISR(或 任务)想要置位 (清零)事件标 志组中的哪些事 件标志。
置位或清零。
OS_OPT_POST_FLAG_SET OS_OPT_POST_FLAG_CLR
说明 建立一个信号量 删除一个信号量 等待一个信号量 取消等待 释放或者发出一个信号量 强制设置一个信号量
4
电子与信息工程学院
1)


信号量要先于调用它的任务之前

被创建



信号量 计数器初值
5
电子与信息工程学院









|
|




6
电子与信息工程学院









|
|




中的第1位和第2位的
33
任一事件发生。
事件标志通常 有两种用途:状态 信息监控和瞬态事 件监控。
电子与信息工程学院
任务汇或报IS的R可瞬以
汇时报事状件态可信能息是。开状关
态被信按息下不、应运该动被传等感
待器这探些测事到件一的个任目务标
“等消。费一掉般”情,况因下为,
这响些应状这态些信事息件是的由任
说明
创建事件标志组
删除事件标志组
等待事件标志
取消等待事件标志
获取使任务就绪的事件标志
向事件标志组发布标志
30
电子与信息工程学院
2、事件标志组
2.2内部结构
Os_type.h typedef CPU_INT32U
OS_FLAGS;
Uc/在o使s-用ii之i中前的一事定件要先标创志建组事是件OS标_F志LA组G_。GR用P类户型需的要内在核启对动象, 由uc多/o个s-事ii件i之标前志,组或成在(启8位动、任1务6位中、创3建2位事)件。标志组。
1.3互斥信号量
互斥信号量是一种特殊的二进制信号量,是一种被定义 为OS_MUTEX数据类型的内核对象,只能被任务使用。
应用程序可以使用无限多个互斥信号量。
uc/os-iii允许用户嵌套使用互斥型信号量。一旦一个任 务获得了一个互斥信号量,则该任务最多可以对该互斥信 号量嵌套使用250次。该任务也必须释放相应的次数才能真 正释放该互斥信号量。
等待一个互斥型信号量
OSMutexPendAbort()
取消等待
OSMutexPost()
释放或者发布一个互斥型信 号量
22
电子与信息工程学院
互斥信号量的内部结构
程序代码决不能直接访问该数据结构的内部成员,而应该23 使用系统提供的API函数。
互斥信号量挂起表
电子与信息工程学院
考虑:什么情况下,使用互斥信号量?
电子与信息工程学院
嵌入式实时操作系统
——μc/OS-III
第六讲 内核对象
1
电子与信息工程学院
主要内容
1、信号量
1.1基本概念 1.2内部结构 1.3互斥信号量 1.4任务信号量
2、事件标志组
2.1基本概念 2.2内部结构
3、消息与消息队列 3.1基本概念 3.2内部结构 3.3任务内建消息队列 eg. 3.4流量控制 3.5保持数据可见性 3.6使用消息队列
电子与信息工程学院
17
注意:
电子与信息工程学院
1、Uc/os-iii二进制与计数型信号量并不加以区分对待。如果 创建信号量时将信号量计数器初始化为1,则是一个二进制信号 量,如果初始值为大于1的值,则是一个计数型的信号量。
2、 Uc/os-iii中,即便在信号量在创建时初始化计数器为1, 系统也不会限制信号量计数的上限值。
电子与信息工程学院
Task0() { OS_ERR err;
…… while(1) { ……
OSSemPend(&mysem1, 0, OS_OPT_PEND_BLOCKING, &ts, &err);
…… OSSemPost(&mysem2,OS_POST_1,&ts, &err); } }
Task1() { OS_ERR err;
如果当事件发生时,用户明确知道该给哪个任务发信号, 就可以使用任务信号量。
25
电子与信息工程学院
26
等待任务信号量
电子与信息工程学院
27
发送任务信号量
电子与信息工程学院
28
电子与信息工程学院
2、事件标志组
2.1基本概念 typedef CPU_INT32U
OS_ቤተ መጻሕፍቲ ባይዱLAGS;
当 任务需 要与多 个事件 的发生 同步时, 可以使 用事件 标志组。
……
“mysem”,
}
0,
}
&err); …… OSTaskCreate(……); …… OSStart(&err); …… }
Task1() { OS_ERR err;
…… while(1) { ……
OSSemPost(&mysem, OS_POST_1
&ts,
&err);
……
}
8
}
电子与信息工程学院
互斥信号量可以解决优先级反转的问题。
19
优先级反转
电子与信息工程学院
20
电子与信息工程学院
使 用 互 斥 信 号 量 访 问 共 享 资 源
21
电子与信息工程学院
互斥型信号量相关函数
函数名
说明
OSMutexCreate()
建立一个互斥型信号量
OSMutexDel()
删除一个互斥型信号量
OSMutexPend()
相关主题