Embedded 版 (精华区)
发信人: vmlinuz (基于考试结束后的庆祝活动计划的研究), 信区: Embeded_system
标 题: 标题:利用实时核的软件设计 -- pSOS软件设计 (2)
发信站: 哈工大紫丁香 (2001年05月16日14:25:07 星期三), 站内信件
对象、名字和标识(ID):
pSOS+是一个面向对象的操作系统,对象种类包括任务、存储域、存储区、
消息队列和信号量。
每种对象均可随时创建,在系统内通过两个标记来识别,一个是预先指定
的名字,另一个是实时产生的ID。对象名字是一个32位数,若是ASCII码则为
四个字符,它由用户指定,并在创建时作为输入参数传给系统,继而pSOS+为
该对象赋予一个唯一的32位的对象标识ID。除了通过名字查询对象ID外,其余
系统调用均通过ID进行。如挂起任务时使用任务ID(Tid),发送消息时使用
消息队ID(Qid),等等。
实时产生的对象ID仅有创建它的任务知道,其它任务若要使用它之前,
必须通过用户指定的名字以下列两种方式获取其ID。
1、利用相应的对象ID查询类系统调用按其名字去查询对应的ID。
2、从创建该对象的任务处以多种方式获取,如创建对象的任务将获得的
对象ID保存在全程变量中,由其它任务直接引用。
任务管理:
通常任务管理提供动态创建和删除任务以及控制任务属性的手段。这组
系统调用有:
t_create 创建新任务
t_ident 获取任务的ID
t_start 启动新任务
t-restart 重新启动任务
t_delete 删除任务
t_suspend 挂起任务
t_resume 恢复被挂起的任务
t_setpri 改变任务优先级
t_mode 改变任务调用任务的方式位
t_setreg 设置(写入)任务的便条寄存器
t_getreg 获取(读出)任务的便条寄存器
1、任务的诞生
任务创建时将其属性传给pSOS+,使pSOS+对它注册以便执行和竞争
其它系统资源。
任务的代码段必须驻留在内存,可以固化在ROM,也可在启动或创建
时装入RAM。任务的数据区可以静态分配也可动态地从pSOS+申请。
建立一个任务需要两个系统调用,即t_create和t_start。父任务调
用t_cteate创建任务,传递的参数有用户指定的名称、调度用的优先级、
堆栈尺寸和工作标志,该标志仅在多处理器系统中有用。
t_create建立一个任务控制块(TCB),分配一段足够大的内存,用
于任务的监控栈和用户栈,建立任务的页面描述块以及其它必要的扩充域。
扩充域是一段额处的内存区,用于可选择的特性。例如,带协处理器的系
统需要FPU(浮点处理单元)保存区,其它系统部件(pHILE+,pREP/C+,pNA+等)
所需的内存。这些内存段连接到TCB。t_create回送pSOS+为新任务分配的Tid
(任务标识)。
t_start必须在任务创建后调用,它提供新任务的启动地址,控制其初始
执行行为的方式字以及一张可选的自变量表。任务启动后,处于就绪态,随后按
其优先级参与调度。
有两个任务是先天存在的。一个是ROOT(根)任务,它由pSOS+在初始化期
间创建并启动,启动后pSOS+将控制交给ROOT任务。另一个是缺省的IDLE(空闲)
任务,也是系统初启时建立的。
系统内同时可存在的总任务数由配置时的参数KC_NTASK 指定。
2、任务控制块
任务控制块(TCB)是pSOS+在建立每个任务后为其分配并管理的系统数据结构,
TCB包含任务执行时系统需要了解的所有信息,包括名字、优先级、剩余时间片以及
环境。通常,环境是指机器寄存器状态,当任务运行时,其环境是随时动态变化的,
因此环境是这些寄存器的实际内容。当任务不运行时,其环境被冻结,并保存于TCB,
以便下次运行时的现场恢复。
在TCB还存在某些管理用的结构,被pSOS+用来管理各种队列和结构。例如,TCB
可以处于下列几种队列之一,即就绪队、消息等待队、信号量等待队、内存区等待
队和超时队。
3、任务方式字
每个任务都附带一个方式字,用来修饰调度策略或控制其执行环境。
(1) 抢占的使能/禁止
若抢占特性被禁止,则该任务一旦运行,则不能被更高优先级的
就绪任务抢占。
(2) 轮转的使能/禁止
它影响时间片轮转的特性。
(3) ASR(异步信号服务子程序)使能/禁止
每个任务可以具备一个异步信号服务子程序(ASR),该子程序
必须由as_catch系统调用公布。异步信号服务子程序与软件中断十分相似,假如
任务的ASR使能,则一个指向该任务的as_send系统调用将迫使它脱离预期的执行
路径。任务的方式字在t_start调用时置初值,并可在以后用t_mode调用动态修改。
4、任务栈
任务创建期间,pSOS+为之分配一个栈。任务栈是每个任务私有的内存,由
任务自身的代码(包括ASR)使用。当运行任务由这个切换为那个时,pSOS+自动
进行栈区的切换。
pSOS+的系统调用和中断处理不使用任务栈,而使用它自已的系统栈,但是
在处理I/O请求时使用任务栈。pSOS+的I/O调用开销60个字节的栈区,另外还需
考虑目标设备驱动程序对栈区的需求。
5、任务的消亡
任务可由自身或被别的任务终止,t_delete调用将删除一个已创建的任务并
将它的内存段返回0#域,释放其它资源。
通常,t_delete应该用于任务删除自身。当必须删除另一任务时,t_delete
使得该任务没有机会去完成必要的清扫工作。一个较为可取的办法是调用
t_restart促使任务返回其原始的入口点。由于t_restart可以传递可选的自变量
表,于是可以用来区分是t_start,还是有效的t_restart或者是自身删除的请求。
在自身删除时,任务可以归还所分配的资源,执行必要的清理工作,然后调用
t_delete删除自身。
6、便条寄存器
每个任务有16个软件便条式的32位寄存器,它们位于任务TCB中,可以利用
t_setreg和t_getreg调用来设置和读取。这些寄存器的用途是为每个任务提供
一组标准的全系统可用的有名变量,可被其它任务,包括其它处理器节点上的
远程任务来读写。
这些便条寄存器中有8个仅供系统使用,剩余的8个可被用户程序用于特定用途。
(二)存储分配
-------------
pSOS+的存储管理提供动态分配可变尺寸的段和固定尺寸缓冲区的手段。相应的
系统调用有:
rn_create 创建内存域(region)
rn_ident 获取内存域的ID
rn_delete 删除内存域
rn_getseg 从内存域中分配一内存段
rn_retseg 把一内存段返回内存域
pt-create 创建缓冲区分区(partition)
pt_ident 获取缓冲区分区的ID
pt_delete 删除缓冲区分区
pt_getbuf 从分区中分配一缓冲区
pt_retbuf 把一缓冲区返回分区
1、域和段
内存域是一个用户定义的、物理上连续的内存块,可具有特殊的隐含的属性。
例如,一种属性是严格局限在本地RAM中,而另一种则可能是全系统可访问的RAM。
区域间必须是互相分开的,而且应定位在长字边界上。
与任务类似,区域也是由pSOS+管理的动态抽象的对象。一个域由rn_create调
用创建,输入参数有用户指定的名字、起始地址以及长度和单位尺寸,该调用返回
所建域的ID(RNid)。其它需要了解该域的任务只能利用名字通过rn_ident调用获
得该域的RNid。
段是域中一片尺寸可变的内存,可通过rn_getseg由pSOS+分配,该调用的输入
参数有域的Rnid,段的尺寸和一个可选择的等待域中存在足够自由内存的时超,
返回该段的地址。
2、专用域
pSOS+至少需要一个域,该专用域命名为“RN#0”,其域标识RNid为0,其起始
地址和长度在pSOS+的配置表中指定。pSOS+启动时,首先占用域0底部作为pSOS+
数据段,用于TCB之类的数据区和控制结构。域0的剩余块作为任务栈以及满足用户
rn_getseg调用提出的申请。与其它内存域?似,应用程序可以调用rn_getseg和
rn_retreg从域0分配和释放尺寸可变的内存段。
3、分配算法
每个内存域均有一个单位尺寸参数,它在创建时指定。这个与域有关的参数是
该域的最小分配单位,它必须是2的幂,而且必须大于等于16字节。任一由rn_getseg
分配的段为最接近单位尺寸的整数倍。
若任务申请一个段但域内没有足够的自由空间,则任务可选择等待,并指定
时超值。若时超到而仍不满足,则返回错误。等待队列的排队规则可以是按优先级
的,也可以是FIFO原则,在区域创建时指定。
4、分区与缓冲区
内存分区(Partition)是用户定义的物理上连续的内存块,被分割为一组尺寸
固定的缓冲区。与内存域相似,分区也是由pSOS+管理的动态抽象对象。分区由
pt_create调用创建,需要输入的参数有用户指定的名字、起始地址和长度以及
缓冲区尺寸,输出pSOS+分配的分区标识(PTid),其它任务需要了解该分区,
可通过名字调用pt_ident获取该分区腜Tid。
分区有如下限制:起始地址必须在长字边界,缓冲区尺寸必须为2的幂且要
大于等于4个字节。
分区可以用在紧耦合多处理器系统中作为处理节点间频繁的数据交换。
(三)通信、同步和互斥机制
-------------------------
pSOS+的应用程序通常分割为一组任务和中断服务程序(ISR),在概念上,
每个任务是可以并发执行的独立动作实体,但是操作系统需要交换数据、同步各
动作或共享互斥的资源。为实现任务到任务以及ISR到任务的通信、同步和互斥,
pSOS+提供三种机制:消息队、事件和信号量。
1、消息队列
消息队列提供十分灵活和通用的通信和同步机制,有关的系统调用有:
q_create 创建消息队列
q_ident 获取消息队列的ID
q_delete 删除消息队列
q_receive 获取或等待队列中的消息
q_send 把消息排入队列尾
q_urgent 把消息排入队列头
q_broadcast 广播一条消息给消息队列
消息队列由q_create调用创建,输入参数有用户指定的名字和几个特征,
包括任务等待队的排队规则是FIFO还是优先级、消息队列长度是否受限以及消息
缓冲区是否私有等。
消息队列具有两类用户,即发送者和接收者,它们可以是任务或ISR。发送
消息的调用有三种:q_send,
q_urgent和q_broadcast。当消息到达队列时没有等待任务,则考贝到消息缓冲区,
然后将其插入消息队列。q_send将消息插入消息队列之尾,q_urgent则将其插入
队列之首。当消息.酱锒恿惺庇幸桓龌蚣父鋈挝裨诘群颍蛑苯痈枧旁诘却恿
兄械耐芬桓鋈挝瘢虼瞬恍枰撼濉_broad
cast将消息广播给所有正在等候的任务,这是用单个系统调用唤醒多个任务的有效
手段。从消息队列中接收消息的唯一调用是q_receive,若当时没有消息,则任务可
直接等待、超时等待或无条件返回。如任务直接等待,则按FIFO或优先级顺序排入
等待队列。
消息是固定长度的含有4个长字的结构。消息的内容与就应密切相关,它可以
装载数据、数据指针、数据尺寸、发送任务的Tid,响应队列的Qid(消息队标识)
或上述诸项的某些组合,它也可纯粹用来同步而不带任何消息。
当消息到达队列而无等待任务,消息需考贝到消息缓冲区并排入消息队。消息
缓冲区为五个长字,增加的那个长字由pSOS+用作链指针域。
2、事件
pSOS+提供一组由事件同步的机制,每个任务均有32个事件标志,构成一个按位
操作的32位字。其中的高16位保留给系统使用,低16位事件标志完全由用户定义。
任务之间和任务与ISR之间由事件来同步的系统调用有:
ev_receive 获取或等候事件
ev_send 将事件发送到指定任务
ev_send用来把一个或几个事件发送给另一任务,而任务可通过ev_receive去
获取一个或几个属于自已的事件,而且可选择等待、带时超的等待或不等待。事件
的一个重要特点是任务可以等待一个事件、几个事件中的一个(或)或者几个事件
中的全部(与)。
任务和ISR均可将一个或几个事件送往另一任务,若目标任务并未等待事件或
它所等事件与送来的事件不符,则ev_send将这些事件位打开,即使它们挂起;若
目标任务正在等待送来事件中的一些或全部,则等待任务解锁并进入就绪,而其余
不匹配的事件仍被挂起。
事件与消息的不同之处有:
(1) 事件可用于任务同步,但不能直接携带信息;
(2) 事件是点对点的,即必须指明具体接收任务,而消息是送往消息队列的,
不需要了解具体接收任务,因此可以多点对多点。
(3) ev_receive一次可等待多个事件,而q_receive一次只能从消息队中接收
一条消息。
(4) 消息可自动缓冲和排队,而事件既不计数也不排队。若一个事件已经
挂起而第二个同类事件送往同一任务,则第二事件将丢失。
3、信号量
pSOS+提供一组熟悉的信号量操作,通常这是实现互斥的最有用的资源标签,
有关的系统调用有:
sm_create 创建信号量
sm_ident 获取信号量ID
sm_delete 删除信号量
sm_p 获取或等待信号量
sm_v 返回信号量
信号量由sm_create动态创建,其输入参数有用户指定的名字、初始计数和几
个特征,包括等待任务的排队规则是FIFO还是优先级;返回信号量标识(SMid)。
初始计数应该反映该资源可占用的有效标签数。
pSOS+提供两个传统的P和V操作。sm_p请求使用信号量,若信号量计数非零,
则其值减1,同时操作成功;否则,调用任务可选择等待、带时超等待或直接返
回,如果选择等待,则按FIFO或优先级顺序排队。
sm_v返回信号量,若无任务等候,则信号量计数增一。若有任务等待,则等待
队列的第一个任务脱离等待队列并变为就绪。
4、异步信号
每个任务可选择具备一个异步信号服务子程序(ASR),其目的是允许任务有两个
异步部分,即主体和ASR。本质上讲,就象一个任务与另一个任务可以异步执行一
样,ASR在任务内提供类似功能。通过信号,一个任务或ISR可以迫使另一任务
脱离正常的执行流程,由主体进入其ASR,因此信?盘峁┝艘恢秩砑卸匣啤U庵忠觳
酵ㄐ拍芰κ切矶嘞低成杓菩枰模裨蚶嗨乒δ苄枰览迪⒒蚴录嗤交疲
庑枰冻鼋洗蟮男阅芩鹗А? 有关的系统调用有:
as_catch 公布任务的ASR
as_send 发送信号到任务
as_return 自ASR返回
异步信号由用户定义,每个任务有32个信号,按位编码为一个长字。要
接收信号,任务必须用as_catch公布一个ASR。as_send用来发送一个或几个
异步信号到指定任务,因而迫使该任务进入它最后一次公布的ASR。在ASR结束
时,调用as_return允许pSOS+把任务返回到原来执行位置。
任务只能具备一个有效的ASR,ASR执行于任务本身的环境内,从外部看,不
可能区分任务运行在主体上还是它的ASR上。
(四)时间管理
-------------
时间管理提供以下功能:
1、管理日历时间和日期;
2、任务等候消息、信号量、事件和段的超时;
3、在预定间隔或指定时刻到达后唤醒或送一告警给指定任务;
4、追踪运行任务的时间片并实现轮转调度机制。
这些功能依赖于周期性定时器中断,而当缺少实时钟或定时器硬件时将
无法工作。显式的时间管理功能有:
tm_tick 通知pSOS+一个时钟嘀嗒的到达
tm_set 设置时间和日期
tm_get 获取时间和日期
tm_wkafter 间隔到达后唤醒任务
tm_wkwhen 指定时刻到达时唤醒任务
tm_evafter 间隔到达后发送事件给任务
tm_evwhen 指定时刻到达后发送事件给任务
tm_evevery 每个间隔周期发送事件到调用任务
tm_cancel 取消告警定时器
1、时间单位
系统的时间单位是一个时钟嘀嗒,定义为两个tm_tick系统调用间的间隔。
通常,tm_tick由每个定时器中断时引导的实时钟ISR调用。tm_tick的频率确定
了系统时钟的粒度,显然频率越高,则时间分辨率越高。但从另一方面看,处理
每一时钟嘀嗒均需化费少量系统开销。
2、时间和日期
pSOS+维护真正的日历时间和日期,包括对闰年的补偿。一对系统调用tm_set
和tm_get可用来设置和获得日期和时间。
3、超时
时间管理提供别的系统调用需要的超时机制,这些调用有q_receive、
ev_receive、sm_p rn_getseg。
4、绝对与相对定时
存在绝对与相对两种定时,相对定时是指定以嘀嗒数计量的间隔,绝对定时
则指定日历日期和时间。tm_wkafter和tm_evafter两条系统调用接受相对定时
参数,tm_wkwhen和tm_evwhen两条系统调用则为绝对时间。
5、唤醒与告警
存在两种任务响应定时的不同方式。第一种方式是进入睡眠(即封锁)而在预期
时间唤醒,这种调用为tm_wkafter和tm_wkwhen。第二种方式是设置告警定时器
并继续运行,这种异步方法由tm_evafter和tm_evwhen提供。当告警定时器到时
后,由pSOS+调用ev_send将指定事件送到任务,.比?任务必须调用ev_receive测试或等
待该调度事件。
告警定时器提供几个有趣的特性。首先,调用任务在定时器减量期间仍能运行。
第二,任务可配备一个以上的不同时间的告警定时器,对应多个期望事件。
最后,告警定时器可由tm_cancel取消。告警也可用于重复的间隔请求,即采用
tm_evevery可实现周期性形为。
--
※ 来源: 武汉白云黄鹤站 bbs.whnet.edu.cn. [FROM: 202.114.2.62]
※ 修改:.dot 于 Dec 13 09:55:46 修改本文.[FROM: 202.114.1.230]
※ 作 者: 白云黄鹤 00-7-31 下午 05:33:14 ※
Re:利用实时核的软件设计 -- pSOS软件设计 (2) 回复
【在白云黄鹤的大作中提到】
我不能上白云黄鹤的BBS发表文章。
不知道兄弟你是否来自hust,我毕业于hust。
我在那儿的帐号是zhengzs,可否帮我查一下。
如果你使用psos+,我们可以交流一下,我已经使用了7年,并且扩充
过psos+内核的Queue和timer的功能。
※ 作 者: 月生 00-8-1 下午 04:29:23 ※
Re:Re:利用实时核的软件设计 -- pSOS软件设计 (2) 回复
你怎么用的那么早,旋极七年前就代理pSOS吗?
※ 作 者: light 00-8-1 下午 05:21:39 ※
Re:Re:Re:利用实时核的软件设计 -- pSOS软件设计 (2) 回复
【在light的大作中提到】
:你怎么用的那么早,旋极七年前就代理pSOS吗?
ISI公司很早就进入中国市场了。旋极1994年才成立,代理的RTOS主要
是Nucleus。
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.97]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:204.932毫秒