微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uC/OSII在C8051F020单片机上的移植

uC/OSII在C8051F020单片机上的移植

时间:11-20 来源:互联网 点击:
DSP的移植就是这样实现的)。
2.3.1 OSStartHighRdy()
OSStart()函数调用OSStartHighRdy(),使就绪态任务中优先级最高的任务开始执行,OSStartHighRdy()移植代码如下:
RSEG ?PR?OSStartHighRdy?OS_CPU_A ; RSEG 选择已经在SEGMENT定义的段
OSStartHighRdy:
USING 0 ; 选择工作寄存器组
LCALL _?OSTaskSwHook
MOV R0, #LOW(OSRunning)
MOV @R0,#01 ; OSRunning = TRUE
OSStartHighRdyRpt:
MOV R0,#LOW (OSTCBCur) ; 取TCB指针OSTCBCur。在单片机C语言中,
INC R0 ; 指针占用3个字节,低字节是指针存储类
MOV DPH,@R0 ; 型编码,第二、第三字节分别存放指针高
INC R0 ; 位、低位地址偏移量。
MOV DPL,@R0
INC DPTR ; 装载OSTCBStkPtr地址到DPTR
MOVX A, @DPTR
MOV R1,A
INC DPTR
MOVX A, @DPTR
MOV R0,A
MOV DPH, R1
MOV DPL, R0
MOVX A, @DPTR ; 出栈第一个字节,即系统堆栈深度
MOV R4,A
MOV R0,#OSStkStart
COPY_STK_TO_SYS: ; 把任务堆栈的数据恢复到系统堆栈
INC DPTR
INC R0
MOVX A, @DPTR
MOV @R0, A
DJNZ R4, COPY_STK_TO_SYS
MOV SP, R0 ; 调整系统堆栈指针
POPAll
RETI
2.3.2 OSCtxSw()
这个函数完成任务切换。包括3个步骤:(1)把系统堆栈保存到当前任务堆栈;(2)找出优先级最高的任务;(3)把高优先级任务的堆栈恢复到系统堆栈。在写这部分代码时,只需写前两部分,第3部分的内容和OSStartHighRdy()几乎完全一样,跳转到OSStartHighRdyRpt开始的部分就可以了。
2.3.3 OSIntCtxSw()
OSIntExit()通过调用OSIntCtxSw(),在ISR中执行任务切换功能。因为OSIntCtxSw()是在ISR中被调用的,这时处理器寄存器已经被保存到任务堆栈。所以只要一条LJMP 指令跳转到OSCtxSw()函数的步骤(2)的入口地址就可以了。
2.3.4 OSTickISR()
时钟节拍中断服务子程序OSTickISR()完成的操作和OSCtxSw()类似,只不过OSTickISR()是由硬件定时器溢出中断触发的,定时器使用了C8051F020单片机的T0,时钟节拍设置为每秒20次,外部的22.1184MHZ晶体经过2分频作为T0基准,只要在退出这个函数之前加上如下2条指令即可。
MOV TH0, #0x2C
MOV TL0, #0x12
3 测试移植代码
创建的2个测试任务及源码如下:
OSTaskCreate(TestTransplantA, (void *)0, & TestTransplantAStk[0],2);
OSTaskCreate(TestTransplantB, (void *)0, & TestTransplantBStk[0],3);
void TestTransplantA(void *ddata) reentrant
{ ddata=ddata;
for(;;)
{ Uart0Send(0xAA);
OSTimeDly(60*OS_TICKS_PER_SEC);
}
}
void TestTransplantB(void *ddata) reentrant
{ ddata=ddata;
for(;;)
{ Uart0Send(0xBB);
OSTimeDly(30*OS_TICKS_PER_SEC);
}
}
多任务调度开始后,通过超级终端接收的UART0的数据为:AA BB BB AA BB BB AA BB BB AA BB BB AA BB BB AA BB BB AA ……。
高优先级的任务TestTransplantA()能首先被调度运行,说明OSTaskStkInit()和OSStartHighRdy()函数是正确的。任务TestTransplantA()和任务TestTransplantB()由时钟节拍驱动而周期地被调度,说明OSCtxSw()、OSIntCtxSw()、OSTickISR()也是正确的。通过以上两点可以认为移植结果是正确的。
4 结束语
在µC/OS-II平台下开发程序,首先要掌握内核。通过上述移植过程,能够对任务堆栈、任务调度有深刻理解。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top