资源描述:
《巧用C-51的BANK编译模式.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、巧用C-51的BANK编译模式朱咏梅(上海电子信息职业技术学院,上海200000)1引言随着C-51编译器被广泛地应用于51系列单片机软件的开发,大批的开发人员从繁琐的汇编语言编程中解放出来.C-51不仅缩短了软件的开发周期,而且使应用软件具有较好的结构性和可维护性.在使用C-51编译器的应用设计中,大多数程序代码都不超过51系列单片机的最大寻址空间64K,但在实际应用中也有程序代码超出64K的情况.这种情况虽然可以通过更换高档CPU来解决,但在产品批量较大且对CPU性能要求并不高时,不希望使用高档CPU,因为这样会增加产品的成本.那么能否在廉价的51系列单片机中突破代
2、码64K空间的限制而进行产品的开发呢C-51编译器的BANK模式正是为了解决此问题.作者通过对C-51编译器BANK模式的使用,总结出一套该模式的使用方法.本文对这一使用方法进行说明,并对代码和数据混合使用BANK的特殊用法作了介绍.2BANK的工作方式C-51的BANK模式对应用系统的代码存储器结构有特殊要求.图1为C-51BANK模式下代码存储器的物理结构.代码地址空间的上半部,以重叠BANK0的物理地址空间,硬件设计了n个存储器页面来存储程序代码.在任一时刻BANK0~n中,只能有一个BANK处于激活状态.当BANKi处于激活状态时,其物理地址空间为BankBas
3、eAddr~0xFFFF.只有当BANK处于激活状态时,BANK中的程序代码才可以运行.为了寻址任意BANK中的过程代码,C-51编译器为过程调用生成了如下的BANK地址:Base地址是可变的,但为译码方便,一般选为8000H.当某过程调用任一不在同一BANK中的其它过程时,BANK地址中的BANKNUMBER被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现不同BANK中的过程调用.下半部分的代码空间没有作BANK处理,它被称为ROOTBANK.这是因为C-51编译器仅对过程调用产生BANK地址,而对于过程调用之外的所有其它部分如CONST等不
4、产生BANK地址,ROOTBANK即用来存放这部分代码.除此之外,ROOTBANK一般还用来存放下列代码:C-51的库函数,所有的变量初始化数据,中断服务程序代码,CSTARTUP代码.编译器总是以NONBANK方式对这一类代码进行操作.3使用C-51BANK模式的步骤假设软件已经按C-51的大模式进行了设计,那么为了使用C-51的BANK模式,要进行以下3个步骤的工作.3.1设计硬件C-51的BANK模式需要硬件来支持.硬件必须设计适当的译码电路来支持存储器的页面结构.尽管C-51编译系统可支持256个存储器BANK页面,但一般的应用系统4个~8个存储器页面即可满足
5、设计要求.在确定了所需存储器页面的个数后,BANK页面的译码地址位也就确定了.假设译码的地址为n位,那么n与BANK页面数的关系满足式(1).2n≥最大所需的BANK页面数n取最小值(1)支持页面结构存储器的译码电路,因使用存储器芯片的空间大小和片数多少的不同而不同.对于n位译码地址的锁存,则有两种方法,最为简单的方法是直接使用CPU多余的口线,若没有多余的口线可用,则需要使用第二种方法,即扩展锁存器对BANK译码地址进行锁存,这时锁存器的锁存地址既可以使用外部RAM空间译码产生,也可以用外部ROM空间译码产生,如使用ROM空间译码产生,要注意地址不能与代码可能占用的地
6、址空间冲突.3.2写BANK模式的源程序C-51BANK模式下的源程序与大模式下的源程序没有太大区别,只是在BANK模式下要注意以下几点:(1)合理规划代码空间规划代码空间就是决定哪一部分代码放在ROOTBANK中,哪一部分代码放在BANK中.前面已经提到,有几种类型代码是必须放在ROOTBANK中的,而对于其它代码来说,既可以放在BANK中,也可以放在ROOTBANK,但为了提高系统的运行效率,对经常被调用的公共程序模块,应尽可能放在ROOTBANK中,以减少BANK的切换.而对于用汇编语言编写的程序模块,如果将其放在BANK中,则需要人工在汇编程序中添加对BANK切
7、换的操作,这项工作非常繁琐,因此用汇编语言编写的程序模块,一般也放在ROOTBANK中.(2)检查源程序模块大小任一个C程序模块,在编译时都要生成一个CODE段,而linker不可能把一个模块的CODE分配到多个BANK中,因此每个程序模块的大小都必须小于或等于一个BANK空间,否则就要把一个程序模块分为两个或多个模块.只要不超出BANK的空间,linker可以把多个程序模块的代码放入一个BANK中,由此看出将每个程序模块最小化,便可以充分利用BANK的空间资源.(3)充分利用非BANK的调用在BANK模式中,当编译器不知道调用与被调用是