|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! }. ]0 _9 F% U9 [/ t d3 M摘要:研究嵌入式实时操作系统μC/OS-1在51微控制器上的移植,提出μc/OS-II任务
) _2 a0 I. D) r- k; I! A的编写规范以及注意事项。对μc/OS-II的移植具有普遍的指导意义,并为51平台的2 |9 y. k2 t3 S7 t
更高层次的开发和拓展打下了基础。
6 Q3 W( \; A4 P
& q$ n) q% g2 Y/ e9 w2 e5 R关键词: μc/OS-II; 51单片机;移植( s, K1 E7 Q1 W9 a! {
4 i% K2 d0 q- U, |: s& I, ^+ H1 y
0引言
# U3 Y) U$ O- L& x% M9 N) Y随着现代计算机技术的飞速发展,嵌人式系统扮 D1 z) a0 t# j
演了越来越重要的角色,嵌人式系统设计日趋复杂,/ g9 ]1 t4 J5 C# }2 }5 M
嵌人式操作系统变得必不可少。嵌人式操作系统uc/3 `2 w- Z5 W. g5 `9 ~( ~
OS- -II凭借其源代码公开.结构小巧、内核可剥夺、实
$ p% ?9 |4 O! U; _$ s4 i6 C时性高等诸多特性使它成为实时性要求很高的情况7 @$ t% J% f% _3 Q) D
下嵌人式操作系统的重要选择之一。
( c3 h( }! p; G/ u- m1 uc/OS- -l1的移植2 F: b% |3 r5 ?5 ^
1.1头文件处理& ?* `0 V1 y ^. _6 L9 R
uc/0S-II要求所有的C源文件都要包含头文件
0 U; J) [/ ?1 b$ w4 TIncludes.h。而在本文中另外增加一个头文件us-! I: Y1 |6 s: ?8 Y
er_ .configer.h, 要求在所有用户的程序中都必须包含
5 I- v3 l5 @) C! N( q. }6 J1 juser_ configer.h, 在user_ .configer.h 中包含Includes.h# a$ j7 y! O7 G1 E% B
和特定应用的头文件和设置项,而在uc/0S-II的系
$ P7 K/ U& t7 v+ S' y统文件中,只包含INCLUDES.H。所有有关应用的设
3 t4 M. z$ `% ^7 n& Y; m置改变都在user_ configer.h 中进行,Includes.h定下来1 V) D+ H3 W7 s* g+ j
后就不必改动。这样做不仅大大减少了在编译过程中
& d% i* B. }0 a A; E" R: ]8 uuc/OS-II的系统文件的编译次数;缩短编译时间,而
4 D" D9 F& ^# v' W6 i1 I9 o; U且用户更改应用程序时不必改动uc/0S-II的系统文.6 X; p3 ~. W2 r; u. \8 s! b
件。( R6 a; [6 A% B4 f6 l( j' L) S
1.2 OS_ _CPU.H文件
( u9 i9 X$ Z/ D9 v由于C语言中的short、int等数据类型依赖于处2 f8 x" x# G; J# Q
理器,为了方便,一般在μc/0S _II内核中不直接使用7 z- ~5 w. U A! N& Y( I5 u
它们,以免产生错误隐患,而用移植性强的、不依赖于9 n; A# C9 q6 q: i& Z
处理器的数据类型代替。堆栈都是按字节操作的,故
0 E- a8 c4 O3 A4 d u数据类型0S_STK声明为8位。方向从低地址向高地4 b" c2 T/ G9 m1 S
址方向递增,所以0S_ _STK _GROWTH设置为0。在本4 P7 k! S! T V) V9 v9 U% ^* H4 b9 J8 m
- v' h; n4 P2 c1 X+ P; a$ h文中把0S_ ENTER CRITICAL 0和0S_ EXIT_ CRITI-( T# P. `: C4 ~& [
CAL0定义为DisableINT0和EnableINTO,具体实现在/ r5 u8 Z9 |* p: u' Y7 Y6 B
OS_ CPU_ C.C文件中。由于51没有软中断故直接定. [' x' q0 D! `6 o
义OS_ TASK SW0宏为函数0SCxSw0。" T8 v3 F+ F8 O U1 Z, a4 G! b
1.3 OS_ _CPU_ _C.C文件
( {' x" A( `+ N! w% Y; p4 T+ |移植μc/OS- -I1需要在0S_ _CPU_ _C.C中实现几个' [( h: ]' m+ h) ?. u3 t6 b
重要的函数,其中OSTaskStkInit0用来初始化任务的
% @+ V. H* G s堆栈。堆的大小可根据任务的实际情况自行确定。55 _8 i6 j+ [- B( I: F
个系统钩子函数可直接定义它们为空函数。μc/OS -II .; T4 x( V& E2 b- E. K$ z
要求用户提供一个周期性的时钟源,来实现时间的延" x4 g$ {9 y4 \3 |8 `1 ]
时和超时功能。时钟节拍应该每秒发生10-100次。为; n ]. C! O; v# S- y% V! j7 d
了完成该任务,本设计使用51的定时器0来提供时' X7 L# E/ Z- h% w* z7 z
钟节拍,因此OS_CPU_C.C文件中还包括定时器0的
/ M Z; j# ~' W2 [$ x, Z( ]. A初始化函数。DisableINT0 、EnableINT0函数也在这个
* V+ ]8 p7 f. B i文件中实现。- D+ G' t+ \$ F$ ~( N5 M
void *0STaskStkInit (void (*task)void *pd), void *ppda-. i( p$ L# E; l6 c# _
ta, void *ptos, INT16U opl) reentrant8 S% B; u: Z- l7 ?
INT8 i;8 v; ~# _ z: W
OS_ STK *stk;; |+ M- `, z* D: e: j
ppdata=ppdata;I1ppdata没被用到保留此语句防7 ?+ q3 ?) A2 g: z
止告警产生0 f! k' \; U3 e) |, C$ z2 `
opt = opt; /opt 没被用到保留此语句防止告警产生! G V: _6 `6 R y
*stk= (OS_ STK *)ptos; /用户堆栈最低有效地址
' c4 c4 c. A$ h5 W*atk++= 15; .
" h: W- j! ?4 w% D//用户堆栈长度7 ]# [% ]9 O: Q) L
*stk++ = (INT16U)task & 0xFF; //任 务地址低8位
1 d- C- D9 S/ M, ]*stk++ = (INT16U)task >> 8;7 U' F6 i }; q5 _* y8 w( e: t
//任务地址高8位# I9 a2 M' p/ j& Y) B# Z, h
for(i=0;i<13;++)
% h4 K% a2 T# Q2 L. y3 D*stk ++ = .0x00;1 o. s5 j4 L, ~# p" J- {7 L
//PSW, ACC, B, DPL, Q; P3 A* W9 R! }. A. c0 g
/ z+ i3 N" y" h! C g$ A3 D
8 _6 \& H4 x$ F' u. W" q( P' e) F% U4 ], T" r( m
附件下载:- s4 D* ?, H; a' X- S2 F H! v
, j% N Q4 N4 q0 k |
|