📄 ucos51移植心得zt(铁匠).htm
字号:
CODE<BR>?PR?OSIntCtxSw?OS_CPU_A SEGMENT
CODE<BR>?PR?OSTickISR?OS_CPU_A SEGMENT
CODE<BR><BR>?PR?_?serial?OS_CPU_A SEGMENT
CODE<BR> <BR>;声明引用全局变量和外部子程序<BR> EXTRN
IDATA
(OSTCBCur)<BR> EXTRN
IDATA
(OSTCBHighRdy)<BR> EXTRN
IDATA
(OSRunning)<BR> EXTRN
IDATA
(OSPrioCur)<BR> EXTRN
IDATA
(OSPrioHighRdy)<BR> <BR> EXTRN
CODE (_?OSTaskSwHook)<BR> EXTRN
CODE (_?serial)<BR> EXTRN
CODE (_?OSIntEnter)<BR> EXTRN
CODE (_?OSIntExit)<BR> EXTRN
CODE (_?OSTimeTick) <BR> <BR>;对外声明4个不可重入函数<BR> PUBLIC
OSStartHighRdy<BR> PUBLIC
OSCtxSw<BR> PUBLIC
OSIntCtxSw<BR> PUBLIC
OSTickISR<BR> <BR> ;PUBLIC
SerialISR <BR> <BR>;分配堆栈空间。只关心大小,堆栈起点由keil决定,通过标号可以获得keil分配的SP起<BR>点。<BR>?STACK
SEGMENT IDATA<BR> RSEG
?STACK<BR>OSStack:<BR> DS
40H<BR>OSStkStart IDATA
OSStack-1<BR><BR>;定义压栈出栈宏<BR>PUSHALL MACRO<BR> PUSH
PSW<BR> PUSH
ACC<BR> PUSH
B<BR> PUSH
DPL<BR> PUSH
DPH<BR> MOV A,R0 ;R0-R7入栈<BR> PUSH
ACC<BR> MOV A,R1<BR> PUSH
ACC<BR> MOV A,R2<BR> PUSH
ACC<BR> MOV A,R3<BR> PUSH
ACC<BR> MOV A,R4<BR> PUSH
ACC<BR> MOV A,R5<BR> PUSH
ACC<BR> MOV A,R6<BR> PUSH
ACC<BR> MOV A,R7<BR> PUSH
ACC<BR> ;PUSH
SP ;不必保存SP,任务切换时由相应程序调整<BR> ENDM<BR> <BR>POPALL MACRO<BR> ;POP ACC ;不必保存SP,任务切换时由相应程序调整<BR> POP ACC ;R0-R7出栈<BR> MOV R7,A<BR> POP ACC<BR> MOV R6,A<BR> POP ACC<BR> MOV R5,A<BR> POP ACC<BR> MOV R4,A<BR> POP ACC<BR> MOV R3,A<BR> POP ACC<BR> MOV R2,A<BR> POP ACC<BR> MOV R1,A<BR> POP ACC<BR> MOV R0,A<BR> POP DPH<BR> POP DPL<BR> POP B<BR> POP ACC<BR> POP PSW<BR> ENDM<BR> <BR>;子程序<BR>;-------------------------------------------------------------------------<BR> RSEG
?PR?OSStartHighRdy?OS_CPU_A<BR>OSStartHighRdy:<BR> USING
0 ;上电后51自动关中断,此处不必用CLR
EA指令,因为到此处还未开<BR>中断,本程序退出后,开中断。<BR> LCALL
_?OSTaskSwHook<BR><BR>OSCtxSw_in:<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> ;*UserStkPtr
===>
R5 用户堆栈起始地址内容(即用户堆栈长度放在此处) 详<BR>见文档说明 指针用法详见C51.PDF第178页 <BR> MOVX
A,@DPTR ;用户堆栈中是unsigned
char类型数据<BR> MOV R5,A ;R5=用户堆栈长度<BR> <BR> ;恢复现场堆栈内容<BR> MOV R0,#OSStkStart<BR> <BR>restore_stack:<BR> <BR> INC DPTR<BR> INC R0<BR> MOVX
A,@DPTR<BR> MOV @R0,A<BR> DJNZ
R5,restore_stack<BR> <BR> ;恢复堆栈指针SP<BR> MOV SP,R0<BR> <BR> ;OSRunning=TRUE<BR> MOV R0,#LOW
(OSRunning)<BR> MOV @R0,#01<BR> <BR> POPALL<BR> SETB
EA ;开中断<BR> RETI<BR><BR><BR>(文章推荐人:丁丁)
<BR><BR></BLOCKQUOTE></TD></TR>
<TR>
<TD width="100%">
<P align=center> </P></TD></TR></TBODY></TABLE></CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -