微波EDA网,见证研发工程师的成长!
首页 > 射频和无线通信 > 射频无线通信文库 > C8051 F12X中多bank的分区跳转问题处理

C8051 F12X中多bank的分区跳转问题处理

时间:08-17 来源:互联网 点击:

按照μ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_SWITCHN不被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分区程序移植中应采取的措施,在开发实例中均得到了很好的应用。

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

网站地图

Top