按照μC/OS-II的要求,在任务创建时,任务栈必须初始化成像运行中的任务刚刚发生过中断一样嘲。?B_CURRENTBANK的初始值取决于该任务所在分组对应的切换代码段的低8位地址。所以,任务堆栈的初始化函数OSTaskStkInit需要加入一个参数INT8U bank,指明该任务位于哪个代码分组中。又由于任务堆栈的初始化函数是被任务创建函数OSTaskCreate调用的,所以该函数一样需要加入参数INT8U bank。
在压栈,出栈宏中需要加入:
PUSH PSBANK
PUSH?B_CURRENTBANK
:
POP ?B_CURRENTBANK
POP PSBANK
在任务堆栈的初始化函数OSTaskStkInit中需要加入:
*stk++=17; //堆栈长度增加2个到17
;
if(bank==0x22:){ //bank2
*stk++=bank;
*stk++=CurrentBank2();
else if(bank==0x33){ //bank3
*stk++=bank;
*stk++=CurrentBank3();
}
else{ //bankl和common
*stk++=0xll; //PSBANK
*stk++=CurrentBankl();
)
其中,bank0用任何的PSBANK值均没有问题,所以简化了PSBANK取值0x00的情况。
函数INT8U CurrentBankl(void),INT8U Current-Bank2(void)和INT8U CurrentBank3(void)是用汇编语言实现的,返回值通过R7传递,目的是获得该任务所在分组对应切换代码段(?SWITCHn)的低8位地址。不用C语言编写的原因同样是?B_SWITCH&N不被C支持。
CurrentBankl(void)代码如下,其他两个类同。
RSEG?PR?CurrentBankl?Os_CPU_A
CurrentBankl:
MOV DPTR,#?B_SWITCHl
MOV R7.DPL
RET
结 语
本文介绍了Keil C51实现大于64 KB程序的bank分组代码切换机制的原理,提出了没有操作系统情况下非正常转移时bank的处理方法以及μc/os—II操作系统在多bank分区程序移植中应采取的措施,在开发实例中均得到了很好的应用。
本文关键字:暂无联系方式51单片机,单片机-工控设备 - 51单片机