位置:51电子网 » 技术资料 » 单 片 机

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

发布时间:2008/5/28 0:00:00 访问次数:405

在8051核单片机庞大的家族中,c8051f系列作为其中的后起之秀,是目前功能最全、速度最快的8051衍生单片机之一,正得到越来越广泛的应用。它集成了嵌入式系统的许多先进技术,有丰富的模拟和数字资源.是一个完全意义上的soc产品。

c805ifl2x作为该系列中的高端部分,具有最快100mips的峰值速度,集成了最多的片上资源。其128 kb的片上flash和8 kb的片上ram足以满足绝大多数应用的需求。使用c8051f12x,只需外加为数不多的驱动和接口,就可构成较大型的完整系统。只是其中128 kb的flash存储器不可避免地要处理bank分区问题。

幸运的是keil c51开发环境对c8051f系列有良好的支持,包括一般的跨bank分区的程序跳转和调用。作为数据存储器使用时,flash的分区读写完全是编程者要考虑的事情,与开发环境无关。本文只针对特殊的强制转移和μc/os—ii在多bank分区中的移植问题展开讨论。


1 c8051f12x在keil c51中的多bank分区转移机制
keil c51的连接定位器支持分组连接,允许生成代码长度大于64 kb的8051目标程序_1_。一般的8051系统只提供16根地址线,需要附加地址线来实现代码分组切换,而编译器产生bank切换代码时受到配置文件l51_bank.a51的支持,所以用户必须根据自己的硬件结构来修改这个配置文件。

c8051f12x系列不用考虑硬件部分,也不存在地址线的扩展问题,因为128 kb的4个bank区全部都在cpu内部,所以作为常规跨bank的跳转和调用,不需要处理1.5l_bank.a51配置文件。但在特殊情况下就必须考虑该问题,否则程序将无法工作。下面以c8051f120为例先讨论代码的透明分组切换过程。

c805ifl20在keil c51的项目配置中被划分为4个bank,每个32 kb。公共bank地址从0~0x7fff,其余bank从0x8000h~0xffff。在对应的配置文件l51_bank.a51中,涉及到特殊功能寄存器psbank(sfr地址:0b1h)、switchn宏、b_bankn、?b_switchn分组信息保存和切换代码,以及?b_curentbank变量。

psbank为c8051f120内的特殊功能寄存器,128kb flash的分bank访问就是通过它来实现的。要想转移到新的bank中去,必须赋予psbank正确的值,然后再转向bank区内地址即可。

switchn宏共有4个,分别是switch0、swltch1、switch2和switch3,对应切换到4个bank中。其中switch0对应的语句为:
mov psbank.#00h ;把00h用1ih、22h和33h替换,

;就是其他三个宏

它将插入到?b_switchn代码中,用来切换新的bank和恢复到原来的bank。


所有4组?b_bankn和?b_swltchn代码也都是用宏实现的,对应4个bank处理。它们汇集在?bank?switch代码段中,整个bank切换及恢复机制非常巧妙,可以实现任意bank之间函数的相互调用及嵌套。下面以bank3区中的main函数调用bankl区的delay_noos()延时函数为例说明该机制。
void main(void){
mcuinit(); //初始化cpu
delay_n00s(10); //延时lo ms
lcmlnition();
:
:
bank3中被调用的函数delay_noos(10)对应的汇编语句为:
lcall c:5049
公共段(即common段,对应bank0)中c:5049处的

汇编语句如下:
mov dptr,#delay_noos
ajmp b_bankl

这里的b_bankl就是宏?b_bank&n中n为1的例程。现在进入问题的核心:全部的跨bank区程序切换及恢复过程依靠公共段中?bank?switch代码段里的以下汇编代码实现,对应的n为0、1、2和3。?bank?swltch segment code page
;
?b_bank&n:
push ?b_currentbank (1)
mov a,#high?bank?switch (2)
push acc (3)
push dpl (4)
push dph (5)
?b_switch&n:
mov ?b_currentbank,#low? b_switch&n
(6)
swltch&n (7)
ret (8)

delay_noos(10)函数的返回地址,即函数lcmini-tion()的入口地址(也在bank3中),其高低位字节表示为addh和addl。程序进入main()后的?b_currentbank变量初值是?b_switch3的低8位,其意义稍后叙述。ajmp b_bankl后程序执行?b_bankl和?b_switchl的(1)~(8),执行到(5)时的堆栈结构如图1所示。


继续执行?b_switchl到(7)时,psbank变为指向bankl,?b_currentbank变为?b_switchl的低8位。执行(8)后,从堆栈结构可以看出,堆栈弹出①作为新的pc值,程序进入delay_noos(10)函数,延时功能完成后,函数最后一条ret指令开始返回。这是keil c51处理bank机制的关键,此时的返回地址为堆栈中的②,此地址即?b_switch&h代码的入口,这里对应

在8051核单片机庞大的家族中,c8051f系列作为其中的后起之秀,是目前功能最全、速度最快的8051衍生单片机之一,正得到越来越广泛的应用。它集成了嵌入式系统的许多先进技术,有丰富的模拟和数字资源.是一个完全意义上的soc产品。

c805ifl2x作为该系列中的高端部分,具有最快100mips的峰值速度,集成了最多的片上资源。其128 kb的片上flash和8 kb的片上ram足以满足绝大多数应用的需求。使用c8051f12x,只需外加为数不多的驱动和接口,就可构成较大型的完整系统。只是其中128 kb的flash存储器不可避免地要处理bank分区问题。

幸运的是keil c51开发环境对c8051f系列有良好的支持,包括一般的跨bank分区的程序跳转和调用。作为数据存储器使用时,flash的分区读写完全是编程者要考虑的事情,与开发环境无关。本文只针对特殊的强制转移和μc/os—ii在多bank分区中的移植问题展开讨论。


1 c8051f12x在keil c51中的多bank分区转移机制
keil c51的连接定位器支持分组连接,允许生成代码长度大于64 kb的8051目标程序_1_。一般的8051系统只提供16根地址线,需要附加地址线来实现代码分组切换,而编译器产生bank切换代码时受到配置文件l51_bank.a51的支持,所以用户必须根据自己的硬件结构来修改这个配置文件。

c8051f12x系列不用考虑硬件部分,也不存在地址线的扩展问题,因为128 kb的4个bank区全部都在cpu内部,所以作为常规跨bank的跳转和调用,不需要处理1.5l_bank.a51配置文件。但在特殊情况下就必须考虑该问题,否则程序将无法工作。下面以c8051f120为例先讨论代码的透明分组切换过程。

c805ifl20在keil c51的项目配置中被划分为4个bank,每个32 kb。公共bank地址从0~0x7fff,其余bank从0x8000h~0xffff。在对应的配置文件l51_bank.a51中,涉及到特殊功能寄存器psbank(sfr地址:0b1h)、switchn宏、b_bankn、?b_switchn分组信息保存和切换代码,以及?b_curentbank变量。

psbank为c8051f120内的特殊功能寄存器,128kb flash的分bank访问就是通过它来实现的。要想转移到新的bank中去,必须赋予psbank正确的值,然后再转向bank区内地址即可。

switchn宏共有4个,分别是switch0、swltch1、switch2和switch3,对应切换到4个bank中。其中switch0对应的语句为:
mov psbank.#00h ;把00h用1ih、22h和33h替换,

;就是其他三个宏

它将插入到?b_switchn代码中,用来切换新的bank和恢复到原来的bank。


所有4组?b_bankn和?b_swltchn代码也都是用宏实现的,对应4个bank处理。它们汇集在?bank?switch代码段中,整个bank切换及恢复机制非常巧妙,可以实现任意bank之间函数的相互调用及嵌套。下面以bank3区中的main函数调用bankl区的delay_noos()延时函数为例说明该机制。
void main(void){
mcuinit(); //初始化cpu
delay_n00s(10); //延时lo ms
lcmlnition();
:
:
bank3中被调用的函数delay_noos(10)对应的汇编语句为:
lcall c:5049
公共段(即common段,对应bank0)中c:5049处的

汇编语句如下:
mov dptr,#delay_noos
ajmp b_bankl

这里的b_bankl就是宏?b_bank&n中n为1的例程。现在进入问题的核心:全部的跨bank区程序切换及恢复过程依靠公共段中?bank?switch代码段里的以下汇编代码实现,对应的n为0、1、2和3。?bank?swltch segment code page
;
?b_bank&n:
push ?b_currentbank (1)
mov a,#high?bank?switch (2)
push acc (3)
push dpl (4)
push dph (5)
?b_switch&n:
mov ?b_currentbank,#low? b_switch&n
(6)
swltch&n (7)
ret (8)

delay_noos(10)函数的返回地址,即函数lcmini-tion()的入口地址(也在bank3中),其高低位字节表示为addh和addl。程序进入main()后的?b_currentbank变量初值是?b_switch3的低8位,其意义稍后叙述。ajmp b_bankl后程序执行?b_bankl和?b_switchl的(1)~(8),执行到(5)时的堆栈结构如图1所示。


继续执行?b_switchl到(7)时,psbank变为指向bankl,?b_currentbank变为?b_switchl的低8位。执行(8)后,从堆栈结构可以看出,堆栈弹出①作为新的pc值,程序进入delay_noos(10)函数,延时功能完成后,函数最后一条ret指令开始返回。这是keil c51处理bank机制的关键,此时的返回地址为堆栈中的②,此地址即?b_switch&h代码的入口,这里对应

相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!