📄 ucos51移植心得zt续1(铁匠).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0036)http://www.mcu51.com/list.asp?id=905 -->
<HTML><HEAD><TITLE>uCOS51移植心得zt续1(铁匠)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="uCOS51移植心得zt续1(铁匠).files/style.css" rel=stylesheet>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="97%"
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD width="100%" bgColor=#d0d0d0>
<P align=center>文章编号:905----加入日期:2003-12-4 </P></TD></TR>
<TR>
<TD width="100%">
<P align=right><A href="javascript:self.close()">『关闭窗口』</A></P></TD></TR>
<TR>
<TD width="100%">
<P align=center><B>uCOS51移植心得zt续1(铁匠)</B></P></TD></TR>
<TR>
<TD width="100%">
<BLOCKQUOTE><BR>;-------------------------------------------------------------------------<BR> RSEG
?PR?OSCtxSw?OS_CPU_A<BR>OSCtxSw: <BR> PUSHALL<BR> <BR>OSIntCtxSw_in:<BR> <BR> ;获得堆栈长度和起址<BR> MOV A,SP<BR> CLR C<BR> SUBB
A,#OSStkStart<BR> MOV R5,A ;获得堆栈长度 <BR> <BR> ;OSTCBCur
===>
DPTR 获得当前TCB指针,详见C51.PDF第178页<BR> MOV R0,#LOW
(OSTCBCur)
;获得OSTCBCur指针低地址,指针占3字节。+0类型+1<BR>高8位数据+2低8位数据<BR> INC R0<BR> MOV DPH,@R0 ;全局变量OSTCBCur在IDATA中<BR> INC R0<BR> MOV DPL,@R0<BR> <BR> ;OSTCBCur->OSTCBStkPtr
===>
DPTR 获得用户堆栈指针<BR> INC DPTR ;指针占3字节。+0类型+1高8位数据+2低8位数据<BR> MOVX
A,@DPTR ;.OSTCBStkPtr是void指针<BR> MOV R0,A<BR> INC DPTR<BR> MOVX
A,@DPTR<BR> MOV R1,A<BR> MOV DPH,R0<BR> MOV DPL,R1<BR> <BR> ;保存堆栈长度<BR> MOV A,R5<BR> MOVX
@DPTR,A<BR> <BR> MOV R0,#OSStkStart ;获得堆栈起址<BR>save_stack:<BR> <BR> INC DPTR<BR> INC R0<BR> MOV A,@R0<BR> MOVX
@DPTR,A<BR> DJNZ
R5,save_stack<BR> <BR> ;调用用户程序<BR> LCALL
_?OSTaskSwHook<BR> <BR> ;OSTCBCur
=
OSTCBHighRdy<BR> MOV R0,#OSTCBCur<BR> MOV R1,#OSTCBHighRdy<BR> MOV A,@R1<BR> MOV @R0,A<BR> INC R0<BR> INC R1<BR> MOV A,@R1<BR> MOV @R0,A<BR> INC R0<BR> INC R1<BR> MOV A,@R1<BR> MOV @R0,A<BR> <BR> ;OSPrioCur =
OSPrioHighRdy 使用这两个变量主要目的是为了使指针比较变为<BR>字节比较,以便节省时间。<BR> MOV R0,#OSPrioCur<BR> MOV R1,#OSPrioHighRdy<BR> MOV A,@R1<BR> MOV @R0,A<BR> <BR> LJMP
OSCtxSw_in<BR>;-------------------------------------------------------------------------<BR> RSEG
?PR?OSIntCtxSw?OS_CPU_A<BR> <BR>OSIntCtxSw:<BR><BR> ;调整SP指针去掉在调用OSIntExit(),OSIntCtxSw()过程中压入堆栈的多余内容<BR> ;SP=SP-4<BR><BR> MOV A,SP<BR> CLR C<BR> SUBB
A,#4<BR> MOV SP,A<BR> <BR> LJMP
OSIntCtxSw_in<BR>;-------------------------------------------------------------------------<BR> CSEG
AT
000BH ;OSTickISR<BR> LJMP
OSTickISR ;使用定时器0<BR> RSEG
?PR?OSTickISR?OS_CPU_A<BR><BR>OSTickISR: <BR> <BR> USING
0 <BR> PUSHALL<BR> <BR> CLR TR0<BR> MOV TH0,#70H ;定义Tick=50次/秒(即0.02秒/次)<BR> MOV TL0,#00H ;OS_CPU_C.C 和 OS_TICKS_PER_SEC<BR> SETB
TR0<BR> <BR> LCALL
_?OSIntEnter<BR> LCALL
_?OSTimeTick<BR> LCALL
_?OSIntExit<BR> POPALL <BR> RETI<BR>;-------------------------------------------------------------------------<BR> CSEG
AT
0023H ;串口中断<BR> LJMP
SerialISR ;工作于系统态,无任务切换。<BR> RSEG
?PR?_?serial?OS_CPU_A<BR> <BR>SerialISR:<BR> <BR> USING
0 <BR> PUSHALL<BR> CLR EA<BR> LCALL
_?serial <BR> SETB
EA<BR> POPALL <BR> RETI<BR>;-------------------------------------------------------------------------<BR> END<BR>;-------------------------------------------------------------------------<BR><BR>文件名
: OS_CPU_C.C<BR><BR>void *OSTaskStkInit (void (*task)(void *pd), void
*ppdata, void *ptos, INT16U <BR>opt)
reentrant<BR>{ <BR> OS_STK
*stk;<BR><BR> ppdata =
ppdata;<BR> opt =
opt; //opt没被用到,保留此语句防止告警产<BR>生 <BR> stk =
(OS_STK
*)ptos; //用户堆栈最低有效地址<BR> *stk++
=
15; //用户堆栈长度<BR> *stk++
= (INT16U)task &
0xFF; //任务地址低8位<BR> *stk++
= (INT16U)task >>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -