您当前的位置:五五电子网电子知识单片机-工控设备51单片机C8051 F12X中多bank的分区跳转问题处理 正文
C8051 F12X中多bank的分区跳转问题处理

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

点击数:7107 次   录入时间:03-04 11:50:11   整理:http://www.55dianzi.com   51单片机

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



上一页  [1] [2] 


本文关键字:暂无联系方式51单片机单片机-工控设备 - 51单片机