|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 c5 ]0 d+ s& X6 K/ s) o3 P
摘要:研究嵌入式实时操作系统μC/OS-1在51微控制器上的移植,提出μc/OS-II任务
* ]; o" |. g$ P# J1 c的编写规范以及注意事项。对μc/OS-II的移植具有普遍的指导意义,并为51平台的
0 R0 \# W/ V5 H# e, }/ p更高层次的开发和拓展打下了基础。; U) G; |$ n0 y' }8 d( M% U
9 t1 v; a6 T9 H4 d) {9 ^ g关键词: μc/OS-II; 51单片机;移植
% r" W6 o2 d' O& K9 a
& h6 w$ o9 m+ V' g& N& z6 e0引言- V0 {4 x8 a/ k: ~- i
随着现代计算机技术的飞速发展,嵌人式系统扮
~! V. ?0 o1 M, @& S& @, J演了越来越重要的角色,嵌人式系统设计日趋复杂,
8 _7 F* Z8 r5 {' Y" z/ I S嵌人式操作系统变得必不可少。嵌人式操作系统uc/
9 }0 t, N7 b- x% E& U) ?( ROS- -II凭借其源代码公开.结构小巧、内核可剥夺、实
. f5 X! C8 z6 K8 ~* B3 v" }. @& d时性高等诸多特性使它成为实时性要求很高的情况
4 O. m! v# o3 c8 D8 z; w" t下嵌人式操作系统的重要选择之一。1 L, R9 v8 p0 j* G
1 uc/OS- -l1的移植: t: A f8 z( _
1.1头文件处理
9 v' v2 G1 j( h* o+ guc/0S-II要求所有的C源文件都要包含头文件
% U1 v N) d2 m. h" [" XIncludes.h。而在本文中另外增加一个头文件us-. w7 a6 Z% }3 _: \" r6 t
er_ .configer.h, 要求在所有用户的程序中都必须包含7 Q3 H9 \4 Y) [4 s7 u6 g
user_ configer.h, 在user_ .configer.h 中包含Includes.h8 ]: j+ R- T$ J% D! }+ y& l2 _( V8 ~
和特定应用的头文件和设置项,而在uc/0S-II的系' \. h* a( h9 f! _" p3 I
统文件中,只包含INCLUDES.H。所有有关应用的设1 u+ S) h9 i% e2 H9 p5 C, `" U
置改变都在user_ configer.h 中进行,Includes.h定下来
6 k8 b. V$ r6 D后就不必改动。这样做不仅大大减少了在编译过程中 @- t2 r7 l& |0 k
uc/OS-II的系统文件的编译次数;缩短编译时间,而3 O4 c& b' r, d0 v
且用户更改应用程序时不必改动uc/0S-II的系统文., D0 Y2 P' [( B: ~
件。1 I6 `2 U+ ?0 l' v
1.2 OS_ _CPU.H文件
/ j# Q8 P! T& M7 W" t! v由于C语言中的short、int等数据类型依赖于处5 l; ^+ }: m8 ?; T2 ?% W
理器,为了方便,一般在μc/0S _II内核中不直接使用& B6 o! M M& a. ~) a
它们,以免产生错误隐患,而用移植性强的、不依赖于
$ k" ~( f2 g- P处理器的数据类型代替。堆栈都是按字节操作的,故
3 { u% j# S5 K- ?9 a& l c& x数据类型0S_STK声明为8位。方向从低地址向高地/ ?" Q' V' x2 i( [- w$ W
址方向递增,所以0S_ _STK _GROWTH设置为0。在本" B# ^. k' ?$ ~6 t% C
# s3 h7 g- n, X4 M( F8 O9 N文中把0S_ ENTER CRITICAL 0和0S_ EXIT_ CRITI-% V9 q( B [ C. X# ~9 j! L/ F: K
CAL0定义为DisableINT0和EnableINTO,具体实现在2 V5 _, [9 z/ t1 a* n
OS_ CPU_ C.C文件中。由于51没有软中断故直接定
) [: i2 @- I) `4 _! O$ P/ e义OS_ TASK SW0宏为函数0SCxSw0。
6 v# E- Q- |. S0 a, J1.3 OS_ _CPU_ _C.C文件, s- w3 i9 F( m: a: T
移植μc/OS- -I1需要在0S_ _CPU_ _C.C中实现几个
7 S! r& U% f6 O. A! _$ Y重要的函数,其中OSTaskStkInit0用来初始化任务的/ I. n, l/ h1 p! j: c
堆栈。堆的大小可根据任务的实际情况自行确定。5; m( P4 r2 m5 G9 A# [; E' P
个系统钩子函数可直接定义它们为空函数。μc/OS -II .
E% ?+ M, @6 S' O- L要求用户提供一个周期性的时钟源,来实现时间的延! Z* @$ _$ U/ `+ w+ o) g- _/ _
时和超时功能。时钟节拍应该每秒发生10-100次。为
3 G. [8 I6 R3 `9 J. i了完成该任务,本设计使用51的定时器0来提供时
+ n; X2 R' }- _1 v: C/ d& N钟节拍,因此OS_CPU_C.C文件中还包括定时器0的
$ p/ o/ w4 a7 p7 J6 p: o% N初始化函数。DisableINT0 、EnableINT0函数也在这个. X0 Q$ X: ]9 n5 Z
文件中实现。
0 X+ k9 H. k( K6 {# Zvoid *0STaskStkInit (void (*task)void *pd), void *ppda-
+ c& d B( P; K$ e5 w2 ita, void *ptos, INT16U opl) reentrant
2 Q4 \- C) K1 O# B" i. f+ uINT8 i;; P% v! b! D3 v+ T, E$ h& P1 _
OS_ STK *stk;
% c. @% b! H( a/ Appdata=ppdata;I1ppdata没被用到保留此语句防
x4 l, V4 c2 }止告警产生
5 L2 Q- V9 k6 e( qopt = opt; /opt 没被用到保留此语句防止告警产生8 w6 j2 r) Q/ u: R( j3 r6 a1 `
*stk= (OS_ STK *)ptos; /用户堆栈最低有效地址
& P' i1 m! y* T*atk++= 15; .2 u ]1 I+ E+ H. I
//用户堆栈长度' c L8 p, o9 _- { t7 c; N
*stk++ = (INT16U)task & 0xFF; //任 务地址低8位& N# [- I; p9 {6 x, P0 ]
*stk++ = (INT16U)task >> 8;" F: I ^& m# K/ g3 g! i8 }0 S6 I/ j
//任务地址高8位
. Q, v4 z( s3 P7 s8 _' E; M* Ufor(i=0;i<13;++)
% I+ K8 u1 L0 u, j7 m l5 ?*stk ++ = .0x00;
, j$ B- I9 N. q//PSW, ACC, B, DPL,
& u: J+ W; X+ `0 Q3 U7 V3 j# M1 ?" s! u
v, r, u3 j( _5 t7 g/ v z7 m6 _) P4 u! G3 H9 `, d1 v
附件下载:1 u4 T+ Q% c# z- Q; t G
1 ]: X; s3 b4 Z. P" E |
|