📄 ucos51移植心得.htm
字号:
is active<BR> AAAAAA111111
is active<BR> AAAAAA111111
is active<BR> BBBBBB333333
is active<BR> CCCCCC666666
is active<BR>
Demo程序经Keil701编译后,代码量为7-8K,可直接在KeilC51上仿真运行。<BR>
编译时要将OS_CPU_C.C、UCOS_II.C、OS_CPU_A.ASM、YY.C加入项目<BR>
<BR>
以上是我这次移植uCOS51的一些心得,写出来只是让准备在51上运行操作系统的同行们少走弯路并增强使用信心。我强烈推荐大家在自己的51系统中使用uCOS这个简单实用的自己的操作系统。它的大小应该不是问题,性能上的提高却是显著的。但愿此文能对朋友们有所帮助,错误在所难免,希望各位大虾指正,诸位高手们见笑了!<BR>
<BR>注:全部源码可来信索要(<A href="mailto:asdjf@163.com"><FONT
color=#0000ff>asdjf@163.com</FONT></A>),以下仅为关键代码部分。
</P>
<P>文件名 : OS_CPU_A.ASM</P>
<P>$NOMOD51<BR>EA BIT
0A8H.7<BR>SP DATA
081H<BR>B DATA
0F0H<BR>ACC DATA
0E0H<BR>DPH DATA
083H<BR>DPL DATA
082H<BR>PSW DATA
0D0H<BR>TR0 BIT
088H.4<BR>TH0 DATA
08CH<BR>TL0 DATA 08AH</P>
<P> NAME
OS_CPU_A
;模块名<BR>
<BR>;定义重定位段<BR>?PR?OSStartHighRdy?OS_CPU_A
SEGMENT
CODE<BR>?PR?OSCtxSw?OS_CPU_A
SEGMENT
CODE<BR>?PR?OSIntCtxSw?OS_CPU_A
SEGMENT
CODE<BR>?PR?OSTickISR?OS_CPU_A
SEGMENT CODE</P>
<P>?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>?STACK
SEGMENT IDATA<BR>
RSEG
?STACK<BR>OSStack:<BR>
DS 40H<BR>OSStkStart IDATA OSStack-1</P>
<P>;定义压栈出栈宏<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>
LCALL _?OSTaskSwHook</P>
<P>OSCtxSw_in:<BR>
<BR> ;OSTCBCur
===> DPTR
获得当前TCB指针,详见C51.PDF第178页<BR>
MOV R0,#LOW (OSTCBCur)
;获得OSTCBCur指针低地址,指针占3字节。+0类型+1高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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -