BANK编译模式在扩大单片机程序存储空间中的应用
2009-12-12姜沫岐
党 蓉,于 丹,姜沫岐
(北京控制工程研究所,北京100190)
BANK编译模式在扩大单片机程序存储空间中的应用
党 蓉,于 丹,姜沫岐
(北京控制工程研究所,北京100190)
利用C51编译器的BANK编译模式解决MCS-51系列单片机程序存储空间受64KB限制的问题,分析Keil C51编译器在BANK编译模式下的切换过程,提供一种软硬件的设计方法,并对设计的正确性进行了验证,从而解决了航天器设备典型单片机只能提供16B地址线对程序代码寻址的问题.
单片机;程序存储空间;C51编译器;BANK编译模式
MCS-51系列单片机是目前航天器各种电子设备中应用非常广泛的8位微程序控制器,早期主要用于各种局部终端单元,进行数据采集、信号传输等.它采用汇编语言进行软件开发,不但程序规模较小,而且处理任务也较单一.随着C51编译器的出现,使得利用高级语言完成单片机软件开发成为可能,MCS-51系列单片机也被越来越多地用于功能要求较复杂的各种场合[1].
C51编译器的应用,使开发人员得以从繁琐的汇编程序开发中解放出来,缩短了软件的研制周期,而且使程序代码具有良好的结构性和可维护性.但相对于汇编语言来说,使用高级语言开发的程序占用的存储空间也大大增加.在使用C51编译器的过程中,虽然大多数程序代码都不超过MCS-51系列单片机的最大寻址空间,但在某些特殊应用情况下,其程序代码会超过64KB.为解决MCS-51系列单片机中代码受64KB空间限制的问题,C51编译器提供 BANK编译模式[2-5].
本文通过对Keil C51编译器在BANK编译模式下的切换过程进行分析,给出了一种软硬件的设计方法,并对设计的正确性进行了验证,从而解决了航天器设备典型单片机只能提供16位地址线对程序代码寻址的问题.
1 扩大程序存储空间的应用
1.1 BANK编译模式的硬件支持
C51编译器的BANK编译模式对程序存储器的结构有特殊要求.图1为在C51编译器的BANK编译模式下程序存储器的物理结构图.
图1 BANK编译模式代码存储器的物理结构
在图1中,代码地址空间的上半部分,有 n-1个与BANK0重叠的物理地址空间,硬件需要设计n个存储器页面用来存储程序代码.在任一时刻,BANK0~BANK n中只能有1个BANK处于激活状态.当BANK i处于激活状态时,其物理地址空间为BANK Base Addr.~0xFFFF.只有当 BANK处于激活状态时,BANK中的程序代码才可运行[6].
为了对任意BANK中的过程代码进行寻址,C51编译器为过程调用分配3个字节的BANK基地址(BANK Base Addr.),高字节为 BANK编号(BANK Number),次高字节和低字节为16位偏移地址(Offset Addr.).基地址是可变的,当某过程调用任意一个不在同一BANK中的其他区间时,BANK Number被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现在不同BANK之间的过程调用.
代码地址空间的下半部分被称为COMMON区.该区没有作 BANK处理,主要用来存放公共程序代码、C51库函数、变量初始化数据、中断服务程序代码和 CSTARTUP代码等[7].
本应用实例中使用的编译器为 Keil C51,设计了两个BANK区.采用BANK分区后的 ROM存储器地址空间分为两段,即 0x0000~0xFFFF和0x10000~0x1FFFF.利用单片机的 I/O口 P1.4,将程序存储区分为 BANK0和 BANK1两个区,根据P1.4的高低状态确定BANK0或BANK1区(低电平调用 BANK0,高电平调用 BANK1),BANK0和BANK1的基地址分别为6100H和16100H.
1.2 BANK编译模式的调用过程分析
当程序进行函数间调用时,由于被调函数可能存在于 COMMON区或任意 BANK区,所以用高级语言开发的程序编译后产生目标代码,其调用关系可能存在下列5种情况:
1)任意一个COMMON区内部函数的调用;
2)任意一个BANK区内部函数的调用;
3)BANK区调用任意COMMON区函数;
4)COMMON区调用任意BANK区函数;
5)不同BANK区之间函数的调用.
这5种函数调用方式的调用过程可分为不需要额外的指令支持和需要额外的指令支持两大类.
(1)不需要额外指令支持的调用
对于第1种和第2种调用方式来说,其函数调用均与非BANK编译模式调用机理一致,函数之间的调用及跳转也不需要增加额外的指令.第3种调用方式也不需要增加额外的指令.进一步分析可知,当程序运行于某一 BANK区中,此时若调用COMMON区的函数,则编译器会生成LCALL Addr.16指令,自动选中与该 BANK区所对应的COMMON函数起始地址.
(2)需要额外指令支持的调用
对于第4种和第5种调用,需要额外的指令支持,并且需要进行跳转表维护、现场保护及切换操作.对于Keil C51编译器,调用过程涉及到3个部分,分别是跳转表、BANK SELECT段和 BANK SWITCH段,它们均存储于 COMMON区,其中后面两个段是Keil C5l提供的汇编源文件 L51_BANK.A51宏展开后的主要部分.BANK SELECT段用于返回地址以及目标地址压栈工作;BANK SWITCH段用于控制P1.4口输出切换信号,实现实际跳转.具体调用过程分析如下.
1)COMMON区中BANK函数调用
用以下调用机理分析假定程序在COMMON1区调用BANK1或 BANK0区函数,而COMMON0区的调用机理与其相同.
a.COMMON1区调用 BANK1区的函数.若在COMMON1区中调用BANK1区的函数,总体过程描述如图2所示.
图2 COMMON1与BANK1间的调用过程
图2 中:①为主调用函数地址压栈,程序跳至跳转表;②为程序跳至 COMMON1的 BANK SELECT段的标志?B_BANK1处,将返回所需的 BANK SWITCH段的标志?B_SWTICH1以及目标函数地址压栈;③为程序跳至 COMMON1的 BANK SWITCH段的标志?B_SWTICH1处,这时 P1.4口产生切换操作,输出高电平;④为程序跳至目标BANK1区的函数运行;⑤为函数运行结束后,返回 COMMON1区的 BANK SWITCH段的标志?B_SWTICH1处,这时P1.4口产生切换操作,输出高电平,维持原状态;⑥为程序返回至COMMON1区,继续运行.
b.COMMON1中调用 BANK0的函数.若在COMMON1区中调用BANK0区的函数,总体过程描述如图3所示.
图3 COMMON1与BANK0间的调用过程
图3 中:①为主调用函数地址压栈,程序跳至跳转表;②为程序跳至COMMON1区的BANK SELECT段的标志?B_BANK0处,将返回所需的 BANK SWITCH段的标志?B_SWTICH0以及目标函数地址压栈;③为程序跳至 COMMON1区的 BANK SWITCH段的标志?B_SWTICH0处,这时 P1.4口产生切换操作,输出低电平;④为程序跳至目标BANK0区的函数运行;⑤为函数运行结束后,返回COMMON0的 BANK SWITCH段的标志?B_SWTICH1处,这时P1.4口产生切换操作,输出高电平;⑥为程序返回至COMMON1区,继续运行.
从上述调用过程可以看出,COMMON1调用BANK1函数与COMMON1中调用BANK0函数最大的区别是P1.4口是否发生切换操作.
2)BANK0与BANK1间的函数调用
用以下调用机理分析假定程序在BANK1区调用BANK0区函数、在 BANK0区调用 BANK1区函数的机理相同.
若从软件BANK1区调用BANK0区的函数,总体过程如图4所示.
图4 BANK0与BANK1之间的调用过程
图4 中:①为主调用函数地址压栈,程序跳至跳转表;②为程序跳至 COMMON1的 BANK SELECT段的标志?B_BANK0处,将返回所需的 BANK SWITCH段的标志?B_SWTICH0以及目标函数地址压栈;③为程序跳至 BANK SWITCH段的标志?B_SWTICH0处,这时P1.4口产生切换操作,输出低电平;④为程序跳至目标 BANK0区的函数运行;⑤为函数运行结束后,返回 COMMON0的 BANK SWITCH段的标志?B_SWTICH1处,这时 P1.4口产生切换操作,输出高电平;⑥为程序返回至BANK1,继续运行.
进一步分析COMMON区中的BANK区函数调用、BANK0区与BANK1区之间的函数调用这两种调用方式,可知:它们在时间特性上是一致的,Keil C51编译器生成的代码进行跨BANK操作需要50个CPU指令周期.
对于COMMON区调用BANK区函数方式来说,在调用目标函数时需要输出地址选择信号,而在返回时则不需要,这是因为 COMMON0区与COMMON1区固化的是相同的代码,可以忽略P1.4口的输出值.
1.3 软件结构的规划
从上述程序调用过程分析可以看出,进行代码空间规划非常重要,在安排程序结构时以尽量减少BANK之间的切换为原则.
尽可能将经常被调用的公共程序模块放在COMMON区中,同时,同一功能模块的函数若发生相互调用,也应尽量安排在相同的BANK区.另外,用汇编语言编写的程序模块,一般也放在COMMON中.
本用例中 COMMON区分配 24.25KB,BANK0与BANK1区分配39.75KB.COMMON区中包含复位和中断向量、代码常数、C51中断服务函数、跳转表及库函数等;BANK0和BANK1区则根据具体情况分别存放相应的代码.
1.4 修改编译选项
编译选项的修改与使用的编译器有关.本用例使用了Keil C51编译器,结合硬件的具体设计情况,在L51_BANK.A5l文件中修改如下两处配置代码,其他不变.
1)设置?B_NBANKS为 2;
2)设置 BANK SWITCH采用单片机 P1.4口操作.
另外,还需要在编译选项中设置BANK区的起始和终止地址.
2 设计验证
通过对资源的分析和拷机试验验证了硬件设计和软件结构规划的正确性以及采用BANK编译模式编译后跨BANK区切换的可行性.
由于在进行BANK区间切换操作时,会占用4个字节的堆栈空间,并且公用变量、常量必须放在COMMON区等缘故,所以本文采用仿真器对程序运行过程中的压栈情况、公用变量及常量进行了单步跟踪及分析,结果表明堆栈空间满足要求,公用变量及常量不存在冲突,数据传递正确.
对软硬件进行了3h的连续拷机试验,试验结果表明程序运行正常.
3 结 论
本文利用Keil C51的BANK编译模式进行软硬件联合设计,解决了MCS-51系列单片机对最大64KB程序空间的限制问题,可供类似应用参考.
[1]徐爱钧,彭秀华.Keil Cx51 V7.0单片机高级语言编程与 μVision2应用实践[M].北京:电子工业出版社,2006:147-605
[2]Keil Elektronik GmbH and Keil Software Inc.A51 macro assembler and utilities for 8051 and variants[M].[S.l.]Keil Elektronik GmbH and Keil Software Inc,2001:293-304
[3]Keil Elektronik GmbH and Keil Software Inc.GS51 getting started withμVision2[M].[S.l.]Keil Elektronik GmbH and Keil Software Inc,2001:67-68
[4]孙涵芳,徐爱卿.MCS-51系列单片机原理及应用[M].北京:北京航天航空大学出版社,1994:148-158
[5]周敬利,卓越.MCS-51程序空间扩展原理及编译器优化[J].计算机工程,2003,29(8):183-185
[6]任克强,胡中栋.一种扩展MCS-51单片机程序存储器地址空间的方法[J].南方冶金学院学报,2002,23(9):38-40
[7]黄晴.基于 C51的 BANK编译器应用[J].机电工程技术,2005,34(8):79-80
Application of BANK Compile Mode in Extending Single Chip Computer Code Space
DANG Rong,YU Dan,JIANG Moqi
(Beijing Institute of Control Engineering,Beijing 100190,China)
Analyzing the switching process of Keil C51 in BANK compile mode,this paper proposes a method using a BANK switching technique to solve the problem that only 64K bytes of code space can be accessed in a single chip computer.On the basis of this analysis,this paper presents and validates a design method on software and hardware,thus solving the problem that the typic 8051 only provides 16 address lines for addressing code space in spacecraft equipments.
single chip computer;code space;C51 complier;BANK switch
TP3
A
1674-1579(2009)04-0044-04
2009-02-27
党 蓉(1970—),女,陕西人,高级工程师,研究方向为计算机及应用技术(e-mail:dang_rong@sina.com.cn).