|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* i, s. G, C" b6 L摘要:研究嵌入式实时操作系统μC/OS-1在51微控制器上的移植,提出μc/OS-II任务* \0 s# L0 \$ a; K+ L* g1 G/ b
的编写规范以及注意事项。对μc/OS-II的移植具有普遍的指导意义,并为51平台的
2 _; j9 i! u% ?0 Q$ Y3 _更高层次的开发和拓展打下了基础。
' O8 Q( Y H# L' ?- l% i' b/ a0 T) e! C" P; P" y% c
关键词: μc/OS-II; 51单片机;移植% u% P. ]7 y& H0 i1 l+ N. m) ~6 Q* L
8 `- K7 l! V1 Y/ |8 V0引言
. Y* j! B8 g4 \6 p1 K随着现代计算机技术的飞速发展,嵌人式系统扮
, y; C+ p- ~8 K( M% b, @& B1 s演了越来越重要的角色,嵌人式系统设计日趋复杂,( G8 t) Q) p3 X9 b6 K+ t
嵌人式操作系统变得必不可少。嵌人式操作系统uc/
8 ^7 z: c" a5 D- tOS- -II凭借其源代码公开.结构小巧、内核可剥夺、实
: y% {: q- Z8 `+ B2 }: u$ h) H时性高等诸多特性使它成为实时性要求很高的情况) ]5 H0 M% |& t" R
下嵌人式操作系统的重要选择之一。) L! n+ u3 M4 J4 D$ `
1 uc/OS- -l1的移植& U5 ]. } m1 ^# P+ [- W
1.1头文件处理: H) [3 D G" q4 y7 U7 E$ w
uc/0S-II要求所有的C源文件都要包含头文件! H8 \( x4 q" E2 y$ a& r+ b
Includes.h。而在本文中另外增加一个头文件us-4 _" m; W5 H/ u9 y2 a2 I
er_ .configer.h, 要求在所有用户的程序中都必须包含: D/ c$ F# [+ r( I' y$ u7 k
user_ configer.h, 在user_ .configer.h 中包含Includes.h
" h( P( x. ^5 a4 S! n3 I, i和特定应用的头文件和设置项,而在uc/0S-II的系1 t+ x% E3 O8 b, g
统文件中,只包含INCLUDES.H。所有有关应用的设
3 a0 @5 v8 `, b* c: k- j置改变都在user_ configer.h 中进行,Includes.h定下来. g4 H# o/ N, @/ q5 S5 u
后就不必改动。这样做不仅大大减少了在编译过程中
& u8 Y2 ]' J% R+ R9 e& y0 B8 xuc/OS-II的系统文件的编译次数;缩短编译时间,而7 G+ F" Z8 j: T1 k. i0 ]; O% H7 x- N
且用户更改应用程序时不必改动uc/0S-II的系统文.
1 P8 g i0 l9 E2 h# T l) k件。
: y# ]7 n7 h. F9 y1.2 OS_ _CPU.H文件
1 _: [9 o, B3 x由于C语言中的short、int等数据类型依赖于处
) N/ j# F7 A4 ^: L! A: U5 h$ U0 K理器,为了方便,一般在μc/0S _II内核中不直接使用
' \( o: o4 U: P0 f: f+ R" b它们,以免产生错误隐患,而用移植性强的、不依赖于1 p- j5 @* r3 O
处理器的数据类型代替。堆栈都是按字节操作的,故
/ z/ ^# U9 K, h" e$ ~数据类型0S_STK声明为8位。方向从低地址向高地+ E1 k" t T. D, p( u
址方向递增,所以0S_ _STK _GROWTH设置为0。在本/ ?# j: k% q! O, A6 l* Z Z. ^
! }# ?7 m( ]9 t
文中把0S_ ENTER CRITICAL 0和0S_ EXIT_ CRITI- ?* @8 @% w) e r
CAL0定义为DisableINT0和EnableINTO,具体实现在* \' B+ O% o, A) K
OS_ CPU_ C.C文件中。由于51没有软中断故直接定( K5 K! S1 k% e6 a: q& m
义OS_ TASK SW0宏为函数0SCxSw0。
5 Z( K+ p8 p! Y6 ]0 o0 S1.3 OS_ _CPU_ _C.C文件
3 a- D; C2 f9 v: p& c- G- B移植μc/OS- -I1需要在0S_ _CPU_ _C.C中实现几个 M' |& W$ m. d0 }3 n; x1 |
重要的函数,其中OSTaskStkInit0用来初始化任务的+ _; o! w t d# D6 ]$ E- _
堆栈。堆的大小可根据任务的实际情况自行确定。5. E5 ~) V9 A0 W/ V4 z
个系统钩子函数可直接定义它们为空函数。μc/OS -II .
4 t5 p& _- N% @/ w# J要求用户提供一个周期性的时钟源,来实现时间的延
# ^* C$ r1 R( Z! V" V/ o+ Q. W时和超时功能。时钟节拍应该每秒发生10-100次。为
$ m& Z2 _) {+ w, M6 H0 w' s了完成该任务,本设计使用51的定时器0来提供时$ _/ C, J2 I5 x/ r
钟节拍,因此OS_CPU_C.C文件中还包括定时器0的1 A- ]' V- P( [$ Z* u; O: t
初始化函数。DisableINT0 、EnableINT0函数也在这个" X1 @' X$ F x
文件中实现。! Z# J' ]$ u- H; A
void *0STaskStkInit (void (*task)void *pd), void *ppda-, E" L2 |# o; U# b) r3 M
ta, void *ptos, INT16U opl) reentrant
s/ }, B) _9 P8 e5 n' g9 P0 m- L# LINT8 i;' l0 b% F. ~' o9 J" j+ T' G
OS_ STK *stk;
4 {+ e$ e, B3 S8 s/ q& Yppdata=ppdata;I1ppdata没被用到保留此语句防
- B" R5 v% C! H+ n y3 ~$ m& R止告警产生
1 Y1 R/ C- o& [opt = opt; /opt 没被用到保留此语句防止告警产生0 m- r4 O8 ]" r' ^
*stk= (OS_ STK *)ptos; /用户堆栈最低有效地址$ k* H' V5 |% y+ C0 L; E
*atk++= 15; .' K9 y! ]" r6 o) J. Z! w
//用户堆栈长度! L' v7 ]9 \- P3 N! C! o
*stk++ = (INT16U)task & 0xFF; //任 务地址低8位
: Y3 m ~0 r/ K: {*stk++ = (INT16U)task >> 8;& l# X1 d2 V9 q& @& N7 |6 Q
//任务地址高8位
. R: T1 Z* l( \for(i=0;i<13;++)
" e- {7 @: i+ r, F7 F8 g- _, }2 [*stk ++ = .0x00;
8 @1 {; L( } h- C# |6 d+ O$ Z+ w, H//PSW, ACC, B, DPL,
# E8 _. u+ O8 Q6 j- A1 X4 B/ v& s
. [8 Z. J! I3 T7 H, B) a3 y' I+ U) S8 F7 ^5 `8 x
附件下载:" [ W5 [5 C, ]% I
+ a8 _. U: Z4 e; [* u0 X
|
|