《工业控制计算机》!""!年 #$卷第 %期
在
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
单片机及 &’( 等智能系统时,系统程序
经常采用这样的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
:主程序循环执行各子程序模块,
并通过中断或查询实现外部事件。但是,这种方式不能
很好地解决实时性问题。比如,即使某子程序模块运行
条件完全具备,若主程序没有运行到该点,子模块也得
不到运行,这在实时性要求严格的系统中是不允许的。
而 !) *+’,--就能很好地解决这样的问题。!) *+’,--
是由 ./012334 编写的实时嵌入式操作系统内核
(56+’),源码完全公开,具有可移植性强、支持多任
务等特点,但其中与处理器相关的部分代码需要用户
用汇编编写。在采用该实时内核的系统中,可以将应用
程序分成若干任务(线程),并赋予每个任务一个优先
级,由该实时系统内核实现任务调度。使各任务在休
眠、就绪、运行、挂起、被中断五种状态间转变。就绪任
务中优先级最高者将占有 )(7。要使 !) *+’,--能在
&’( 芯片 68’9!")$:"; 上运行,必须做相应的移
植,主要工作是有针对性地编辑 !) *+’,--中的三个
与处理器相关的文件:"+’<)(7=>#+’<)(7<)=)
$+’<)(7=?’8
! "#$%&’()文件的编辑
在 +’<)(7=>头文件中,定义了与处理器相关的
常量 +’<’6@
、宏 +’ 中还定义了宏
+’; $"%&’"(%")*+ ?@A*B /C&D 9(B+
-!软中断实现任务切换! -
此外,系统为区别不同的 ,#E 压栈顺序,需用户
根据所选 ,#E自定义 $"%"&(%FD$)&G常量的值H
若堆栈是从低地址向高地址方向伸展,定义为 3,反之
为 I。 &0"123,4536 的堆栈增长方向是递减的,因
此 $"%"&(%FD$)&G为 I,即:
9:;<=>; $"%"&(%FD$)&G I
! "#$%&’$%(%文件的编辑
$"%,#E%,J, 文件中,要求用户编写六个 , 函
数 :$"&?@K"7K/>=7 *+、$"&?@K,L;?7;GMMK *+、$"N
&?@K!;OGMMK*+、$"&?@K"PGMMK*+、$"&?@K"7?7GMMK
*+、$"&=A;&=QKGMMK*+。其中只有 $"&?@K"7K/>=7*+是
必要的,其它函数是为方便用户扩展功能而设,因而可
定义为空。
函数 $"&?@K"7K/>=7*+用于系统创建用户任务时,
建立并初始化任务堆栈。该函数跟处理器的硬件体系
密切相关,它将所有的寄存器压栈,返回新的堆栈栈
顶,并将它们保存在该任务的任务控制块 $"%&,R
中,最终使初始化后的堆栈跟刚发生过一次中断一样。
这样,系统无需对调度程序作特殊地处理即可直接对
新任务进行调度。在 &0"123,4536系统中应该保存
的寄存器有:累加器 ’、R,辅助寄存器 ’D8,以及寄存
器 R(、&、"&3、"&I、RD,、#0"&、DS’、D"’、/0D 等。
为方便起见,可以定义寄存器压栈和出栈的宏。!, -
$".// 系统还给该函数提供了任务代码指针!7?@K,
参数指针!T:?7?以及栈顶指针!T7M@ 等,函数可由
!T7M@获取任务堆栈指针 "#,并将参数指针!T:?7?
的值放到 ’ 中,然后将!7?@K 压栈,接着各寄存器赋
初值并压栈,保存在寄存器中的参数也随之存放在堆
栈中,最后返回栈顶指针给 $"%&,R,此时的任务堆
栈就符合系统要求了。当初始化后的任务成为最高优
先级的就绪任务时,系统调度函数根据该任务控制块
$"%&,R 中保存的栈顶指针,将堆栈中保存的寄存器
值切换到 ,#E 的寄存器中,使系统开始运行当前最
高优先级任务。事实上,这个过程模仿了编译器对程序
地调用。
) "#$%&’$*(*#+文件的编辑
此文件包括的四个函数都涉及对寄存器地处理,
跟处理器有关,由于不同的处理器有不同的寄存器,所
以操作系统在这个文件里给用户留下四个函数接口,
以便用户根据所选处理器编写相应的汇编程序以完成
固定的功能。四个函数分别是 $""7?L7G=UVD:W*+、
$",78"P*+、$"/>7,78"P*+、$"&=QK/"D*+。
1JI $""7?L7G=UVD:W*+
该函数是由启动函数 $""7?L7*+调用的,功能是使
系统能及时地运行优先级最高的就绪任务,由于系统中
数据指针 $"&,RG=UVD:W 一直指向就绪任务中优先
级最高的任务控制块 $"%&,R,使得 $""7?L7G=UVD:W
*+轻易就可获取最高优先级任务的栈顶指针,再将保存
在此任务堆栈的寄存器值恢复到 ,#E寄存器中,使该
任务得以运行,实现多任务的启动。对 &0"123,4536
而言,$""7?L7G=UVD:W*+代码编写如下:
%$""7?L7G=UVD:WX
,’YY 9%$"&?@K"PGMMK Z 调用用户自定义的 $"N
&?@K"PGMMK *+
Y! !*%$"&,RG=UVD:W+H ’ Z$"%&,R 的 3偏址单元存放
的是任务堆栈指针
C$#
"&Y0 ’H ’D3 Z’D3 中的值是该 &,R 的地址
C$#
Y! !’D3H ’ Z获得堆栈指针
C$#
"&Y0 ’H "# Z将堆栈指针指向任务堆栈
C$#
"& 9IH !*%$"D[>>=>U+ Z设定 $"D[>>=>U 为 &DES
,$C&S\&%DS"&$D] Z恢复所有寄存器
DS&S Z中断返回
在调用函数 $"&?@K"PGMMK*+时,由于当前任务
控制块 $"&,RQ[L 仍然指向将要被切换出去的任务,
而 $"&,RG=UVD:W 则指向即将被运行的任务,因此
用户可在 $"&?@K"PGMMK*+中对它们操作,以实现特
殊的功能,当然该函数也可定义为不做任何事的空函
数。从程序我们可以看出,要运行最高优先级的任务,
首先得找到该任务堆栈指针,然后将寄存器内容及参
数从堆栈中恢复到 ,#E 的寄存器中,$"D[>>=>U 只
是用来区分是 $""7?L7G=UVD:W*+还是正常的任务切
换在调用 $"&?@K"PGMMK*+。当执行了中断返回指令
后,处理器开始执行最高级的就绪任务。
1J2 $",78"P*+
前面曾提过,任务切换时使用了软中断,并将中断
向量指向 $",78"P*+,因此该函数所要做的就是执行
任务级的任务切换。其目的是为了保证 ,#E 永远运
行就绪
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中优先级最高的任务。这跟 $""7?L7G=UVN
D:W*+类似,然而,前者是由 $""7?L7*+调用的,只是执
行启动多任务的功能,而 $",78"P*+是任务调度函数
12
《工业控制计算机》!""!年 #$卷第 %期
&’’()*+,-通过宏 &’./0’1.’2,-调用的,执行的是
多任务的调度功能:不仅要使高优先级任务得以恢复
运行,还得将待切换出去的任务保存起来,两者的差别
也可以从程序代码中比较出来:
.&’345’67
3&8/9:/.’0;9 <保存处理器寄存器内容
=>? ’@A B <当前任务堆栈指针保存到任务
&’./3B 中
=> !,.&’/3B3CD-A 0 <
8&@
’/=? 0A 0E" <
8&@
’/= BA !0E" <
30== F.&’/GHI’6JKKI < 调 用 用 户 自 定 义 的 &’L
/GHI’6JKKI ,-
=> !,.&’/3BJMN)E+O-A 0 <待恢复任务优先级控制块
=> !,.&’@DMKJMN)E+O-A B <待恢复任务优先级
’/= 0A !,.&’/3B3CD- <高优先级就绪任务赋予当前
控制块
’/= BA !,.&’@DMK3CD- < 待恢复的就绪任务优先级设
为当前优先级
’/=? 0A 0E" <恢复任务堆栈指针
8&@
=> !0E"A 0 <
8&@
’/=? 0A ’@ <指针指向优先级最高就绪任务堆栈
8&@
8&@
3&8/9:/.E9’/&E9 <恢复寄存器
E9/9 <执行中断返回指令
显然,对当前任务相关内容地保存、给当前优先级
数据结构赋值以及给当前任务控制块赋值都是 &’L
’4GD4JMN)E+O,-所不具有的。也许有人会产生疑问,既
然这是任务级的切换,为什么要执行中断返回指令
“E9/9”而不是“E9/”呢?这是因为任务执行的时候必
须允许中断,所以不仅需要将栈中的返回地址弹回
@3A同时还需自动对 ’/# 的中断屏蔽位清零,即允许
中断,因此必须选择“E9/9”返回。
PQP &’RS4345’6,-
与 &’345’6,-相比较,&’RS4345’6,-也是执行任
务切换的,但它执行中断级的任务切换。为什么不使用
现成的 &’345’6,-进行切换呢?主要基于这样的考
虑:(#)它是在中断处理程序中调用的,类似于 &’3L
45’6,-中保存寄存器的工作在进入中断时就做过了;
(!)它是中断子程序通过 &’RS495M4,-调用的,两级调
用都存在对返回地址等参数的压栈操作,这就使得此
时的堆栈比起 &’345’6,-切换时在栈顶位置多了一
些压栈。而 !3 T&’URR要求被任何方式挂起的所有任
务都必须具有相同的堆栈结构,以便于系统能够及时
恢复任务的运行。为此,我们必须做相应的处理:首先,
无需再次保存寄存器;其次,必须改变堆栈指针 ’@,使
栈结构跟所有被挂起的任务栈结构一样。假定进入
&’RS4345’6,-之初,任务堆栈情形如下:
:::: <调 &’RS4345’6,-时压栈的返回地址
:::: <调 &’RS495M4,-产生的返回地址
" ::::<以下是保存的相关寄存器内容
V
::::<中断返回地址
当然此堆栈就是即将要被切换出去得任务堆栈,
当所有比它更高优先级的就绪任务运行完毕后,我们
希望此任务能够从被中断的位置继续执行,因此该任
务堆栈需要保存中断返回地址以及任务中断时 3@W
的所有有关的寄存器内容。与一般正常挂起的任务堆
栈相比较,该堆栈只是在栈顶位置多了两个返回地址
的压栈,因此只要使用指令“XE0?9 I”将栈顶调整
至上图的箭头所指位置即可。至于保存当前任务堆栈
指针,以及给当前控制块赋值等工作则跟 &’345’6,-
中一样。值得注意的是,调整前的堆栈结构事实上还跟
用户使用的汇编器有关,因此一定要先弄清函数调用
时是否还有其它可能的压栈操作再做调整。
PQY &’/M(IR’E,-
&’/M(IR’E,-也是 !3 T&’URR 操作系统中要求用
户提供的汇编程序,它是时钟中断服务程序,实现时间
的延迟和期满功能,其具体流程如下:
保存寄存器"调 &’RS49S4*D,-或使 &’RS48*H4MSN
加 #"调 &’/MZ*/M(I,-"调 &’RS495M4,-"恢复寄存
器"执行中断返回
其中 &’/MZ*/M(I,-函数定时对所有的任务控制
块中的 &’/3B>[O减一,当某任务的 &’/3B>[O 减为
零时,就将其转到就绪态,以备运行,但这程序跟具体
的处理器无关,这里就不多加描述。而 &’RS495M4,-主
要用于判别中断地执行是否使得更高优先级的任务进
入就绪态,如有,则进行任务切换,否则返回。至于时钟
中断可由 >’@的定时器周期计数器 @E>产生。
另外 KH.(\NQ) 中有关参数的定义以及 MS([C+*Q)
头文件也要根据实际情况有所添减。
! 结束语
当所移植的操作系统在目标系统上正常运行,需
要处理器处理的各项工作,用户只要分别建立一些任
务,并设定其优先级就行了。在 !3 T&’URR系统中每个
任务都是一个无限循环的函数,当正在运行的任务进
入延时程序或在等待消息时会自动挂起,3@W 运行其
它的就绪任务。当某任务运行条件满足时,就进入就绪
(下转第 P]页)
PP
《工业控制计算机》!""!年 #$卷第 %期
(上接第 &&页)
状态,操作系统会根据其优先级进行调度,如果它比当
前任务优先级更高,就进行任务切换,系统保证永远运
行优先级最高的就绪任务。对时间要求严格的任务则
可以设定为高优先级,保证及时占有 ’()。只要充分
利用该实时嵌入式内核的任务调度,消息传送,邮箱传
递,延时等功能,就能将各种运行条件及时的传送到目
的任务,保证各种用户任务能在第一时间得到处理。
参考文献
# *+,- *./,01233+,著.邵贝贝,译.!’ 423566———源码公
开的实时嵌入式操作系统.中国电力出版社,!""#(7)
! 893&!"’$:; <3( ’() (=>?@A=>BCD.8+E,3 6-381)5
9+-83
& 893&!"’$:; <3( 9F=GHF?I 6FDJ>KIJ?HF 3=J.8+E,3
6-381)9+-83
: 893&!"’$:; 2@J?G?L?FM ’ ’HG@?C=>.8+E,3 6-381)5
9+-83 [收稿日期:!""!.#.]
一环境,并且有能力对环境作为灵活和自治的反应,以
满足设计目标。进一步讲,软件代理是:"清晰的问题
解决实体,有定义良好的边界和接口;#位于(嵌入在)
一个特定的环境,并对环境可作出反应;$被定义去完
成特定的目标;%自治的,控制自已的内部状态和行
为;&对于设计目标,具有灵活的问题解决能力。
类似于 ,M=FJ 概念的一些尝试在计算机科学的
先驱 ,.8K>?FM有关密码破译的工作中可以看到NOP。
%.!基于软件代理的软件工程
将面向代理的技术应用于软件开发会带来的一些
益处。通常,认为处理软件复杂性的方法可以归结为以
下三种N!P:分解:处理一个大问题的最基本技术是将其
分解为一些小问题,更加容易管理并相对孤立的。抽
象:这一过程将定义系统的一个简化模型,只是强调系
统中某属性细节,而忽略其它的属性。组织:这一过程
标识和管理各个问题解决要素之间的关系。
而面向代理的分解方法是划分复杂系统的问题空
间更有效的技术;面向代理的抽象机制提供了为复杂
的软件系统建模更为自然的方法;面向代理的组织方
法更加适应用于复杂的软件系统。
Q 面向 !"#$%&的程序设计方法
目前,在软件工业界流行的程序设计方法是面向
对象程序设计R22(S,其后提出的一些程序设计方法被
称为后面向对象程序设计方法 R(HDJ52TU=IJ (>HV
M>BGG?FMW(2(SW 其中一个主要的方法是面向 ,D@=IJ
程序设计方法R,D@=IJ52>?=FJ=X (>HM>BG?FMSN##P。
,2( 技术是一种改进软件设计和实现中有名的
关联分离R3=@B>BJ?HF HY IHFI=>FDS问题 N#"P的有力手
段W,2( 方法提供一种显式的机制来处理程序结构中
的横向的关联R’>HDDIKJJ?FM IHFI=>FDS。使用传统的
程序设计技术处理关联一般采用异常处理、多对象协
议、同步化、资源共享等方法,这些方法的不足是对关
联处理的模块性,以致程序不易开发和维护。所谓的
,D@=IJ 是一段代码用来描述在程序中重复出现的一
个特性。比如,我们的一个面向对象的图形系统中我们
会实现直线类和圆类,在其中均有关于显示更新的有
关类方法,我们认为是一种横向的关联,在 ,2( 技术
中可以在一 ,D@=IJ 中实现一个模块化的有关显示更
新行为,由于是一个单一的模块单元中实现的,使用我
们可以将其作为一个设计单位来考虑。
,2(技术可以看是 22(技术本身局限性的一个
补充,它主要从处理程序结构中关联分离问题入手,为
我们把握软件开发的复杂性提供另一个有力的机制。
参考文献
# Z. (. 0>HH[D.8A= G\JA?IBC GBF5GHFJA.,XX?DHF ]=D5
C=\W#OO$
! (>=DDGBF.软件工程5实践者的研究之路(第五版).清华大
学出版社,!""#
& +. ^BGGBW 1. _=CGW 1. *HAFDHF BFX *. ‘C?DD?X=D
<=D?MF (BJJ=>FD.,XX?DHF ]=DC=\W#OO$
: -. 1. *=FF?FMD BFX 9. ]HHCX>?XM= R=XD.S.,M=FJ J=IA5
FHCHM\a YHKFXBJ?HFDW B@@C?IBJ?HFD BFX GB>[=JD.3@>?FM=>
‘=>CBMW#OO7
$ 0. 9=\=>.2TU=IJ5H>?=FJ=X DHYJbB>= IHFDJ>KIJ?HF.(>=F5
J?I= _BCCW#O77
% _. ,. 3?GHF.8A= DI?=FI=D HY JA= B>J?Y?I?BC.968 (>=DDW
#OO%
Q ’. 3L\@=>D[?.’HG@HF=FJ 3HYJbB>=.,XX?DHF ]=DC=\W
#OO7
7 ’H@C?=FW*.2.,XcBFI=X ’dd 3J\C=D BFX 6X?HDG,XX?5
DHF5]=DC=\W1=BX?FMW9,W#OO!
O ?D -.’AH>BYBDW,M=FJ 8=IAHCHM\ _BFXTHH[.9I
^>Bb5_?CC,#OOO
#" (B>FBDW <..2F JA= I>?J=>?B JH T= KD=X ?F X=IHG@HD5
?FM D\DJ=GD ?FJH GHXKC=D. ’HGGKF. ,’9 #$W #!W
#OQ!
## 3BFX>B eB\ 9?CC=>.,D@=IJ52>?=FJ=X (>HM>BGG?FM
8B[=D ,?G BJ 3HYJbB>= ’HG@C=;?J\W 6+++ IHG@KJ=> W
cHCKG= &:W FKGT=> :W !""#
#! 田捷,顾明.软件工程环境的集成模型与应用.计算机研究
与发展,#OO"(#)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
&Q