您当前的位置:五五电子网电子知识单片机-工控设备综合-其它巧用C-51的BANK编译模式 正文
巧用C-51的BANK编译模式

巧用C-51的BANK编译模式

点击数:7764 次   录入时间:03-04 11:40:29   整理:http://www.55dianzi.com   综合-其它

1引言
    随着C-51编译器被广泛地应用于51系列单片机软件的开发,大批的开发人员从繁琐的汇编语言编程中解放出来。C-51不仅缩短了软件的开发周期,而且使应用软件具有较好的结构性和可维护性。在使用C-51编译器的应用设计中,大多数程序代码都不超过51系列单片机的最大寻址空间64K,但在实际应用中也有程序代码超出64K的情况。这种情况虽然可以通过更换高档CPU来解决,但在产品批量较大且对CPU性能要求并不高时,不希望使用高档CPU,因为这样会增加产品的成本。那么能否在廉价的51系列单片机中突破代码64K空间的限制而进行产品的开发呢?C-51编译器的BANK模式正是为了解决此问题。作者通过对C-51编译器BANK模式的使用,总结出一套该模式的使用方法。本文对这一使用方法进行说明,并对代码和数据混合使用BANK的特殊用法作了介绍。
2BANK的工作方式
    C-51的BANK模式对应用系统的代码存储器结构有特殊要求。图1为C-51BANK模式下代码存储器的物理结构。


    代码地址空间的上半部,以重叠BANK0的物理地址空间,硬件设计了n个存储器页面来存储程序代码。在任一时刻BANK0~n中,只能有一个BANK处于激活状态。当BANKi处于激活状态时,其物理地址空间为BankBaseAddr~0xFFFF。只有当BANK处于激活状态时,BANK中的程序代码才可以运行。为了寻址任意BANK中的过程代码,C-51编译器为过程调用生成了如下的BANK地址:

    Base地址是可变的,但为译码方便,一般选为8000H。当某过程调用任一不在同一BANK中的其它过程时,BANK地址中的BANKNUMBER被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现不同BANK中的过程调用。下半部分的代码空间没有作BANK处理,它被称为ROOTBANK。这是因为C-51编译器仅对过程调用产生BANK地址,而对于过程调用之外的所有其它部分如CONST等不产生BANK地址,ROOTBANK即用来存放这部分代码。除此之外,ROOTBANK一般还用来存放下列代码:C-51的库函数、所有的变量初始化数据、中断服务程序代码、CSTARTUP代码。编译器总是以NONBANK方式对这一类代码进行操作。
3使用C-51BANK模式的步骤
    假设软件已经按C-51的大模式进行了设计,那么为了使用C-51的BANK模式,要进行以下3个步骤的工作。
3.1设计硬件
    C-51的BANK模式需要硬件来支持。硬件必须设计适当的译码电路来支持存储器的页面结构。尽管C-51编译系统可支持256个存储器BANK页面,但一般的应用系统4个~8个存储器页面即可满足设计要求。在确定了所需存储器页面的个数后,BANK页面的译码地址位也就确定了。假设译码的地址为n位,那么n与BANK页面数的关系满足式(1)。
    2n≥最大所需的BANK页面数n取最小值(1)
    支持页面结构存储器的译码电路,因使用存储器芯片的空间大小和片数多少的不同而不同。对于n位译码地址的锁存,则有两种方法,最为简单的方法是直接使用CPU多余的口线,若没有多余的口线可用,则需要使用第二种方法,即扩展锁存器对BANK译码地址进行锁存,这时锁存器的锁存地址既可以使用外部RAM空间译码产生,也可以用外部ROM空间译码产生,如使用ROM空间译码产生,要注意地址不能与代码可能占用的地址空间冲突。
3.2写BANK模式的源程序
    C-51BANK模式下的源程序与大模式下的源程序没有太大区别,只是在BANK模式下要注意以下几点:
    (1)合理规划代码空间
    规划代码空间就是决定哪一部分代码放在ROOTBANK中,哪一部分代码放在BANK中。前面已经提到,有几种类型代码是必须放在ROOTBANK中的,而对于其它代码来说,既可以放在BANK中,也可以放在ROOTBANK,但为了提高系统的运行效率,对经常被调用的公共程序模块,应尽可能放在ROOTBANK中,以减少BANK的切换。而对于用汇编语言编写的程序模块,如果将其放在BANK中,则需要人工在汇编程序中添加对BANK切换的操作,这项工作非常繁琐,因此用汇编语言编写的程序模块,一般也放在ROOTBANK中。
    (2)检查源程序模块大小
    任一个C程序模块,在编译时都要生成一个CODE段,而linker不可能把一个模块的CODE分配到多个BANK中,因此每个程序模块的大小都必须小于或等于一个BANK空间,否则就要把一个程序模块分为两个或多个模块。只要不超出BANK的空间,linker可以把多个程序模块的代码放入一个BANK中,由此看出将每个程序模块最小化,便可以充分利用BANK的空间资源。
    (3)充分利用非BANK的调用
    在BANK模式中,当编译器不知道调用与被调用是否在同一个BANK时,就会按照BANK调用方式产生程序代码。但在下列4种情况中,编译器能够知道调用与被调用是否处在一个物理BANK中。这时编译器将产生空间少、速度快的非BANK调用的程序代码。
    第一种情况是,当调用与被调用过程在同一个源程序模块时,编译器可知道它们在同一个物理BANK中。这时编译器使用非BANK方式产生函数调用代码。
    第二种情况是,当过程被说明为static类型时,编译器认定所有对static过程的调用均在本程序模块中,编译器产生非BANK的调用方式。
    第三种情况是,对于被说明为interrupt的中断过程,编译器总是产生非BANK的调用方式对其调用,因中断过程总要放在ROOTBANK中。
    第四种情况是,根据BANK的分配情况,使用nonbanked编译条件对源程序中的过程进行说明,人为地控制编译器产生非BANK方式的调用。
    (4)检查汇编语言程序模块中是否有对BANK中过程的调用
    在由大模式程序向BANK模式转换时,要检查汇编语言程序中是否有对BANK中C过程的调用。如果汇编程序中有对C过程的调用,必须对调用进行改写,即增加对BANK切换的操作。
3.3改变编译、链接开关和函数库
3.3.1改变编译开关
    改变编译开关就是要修改makefike文件中的编译选项。这里要改变的就是将ml改为mb。对于放在ROOTBANK中的模块,其编译选项中还要增加一项RCODE。
3.3.2改变链接开关
    改变链接开关要在.XCL文件中进行。首先在链接开关Z选项中增加RCODE,即:
    Z(CODE)INTVEC,RCODE,D_CDATA,I_CDATA,CONST=0
    该开关用于列出除CODE段之外的所有段的排放次序。
    除了进行上面的修改外,还要增加如下的链接选项:
    A表示bank_number的起始值是0
    B表示bank的16位偏移地址起始值为8000H
    C表示CODE段应放入2000H字节长度的BANK中
    D表示bank_number应按0001H的步长增加
    E表示bank的16位偏移地址按0000H步长增加,这意味着对任意bank,其16位偏移地址总为8000H
3.3.3改变库函数
    改变库函数就是将大模式下链接所需的库CL8051L.R03换成BANK模式的库函数CL8051B.R03。而最为重要的就是改写CL8051B.R03中的L18.S03汇编语言模块。该程序模块是BANK工作模式下实现BANK切换的核心。它完成将banknumber送到BANK切换的译码电路。这个模块要根据具体的译码电路进行改写。
4代码和数据的混合BANK技术
    有一些应用程序,不仅程序代码超过64K,而且还有大量的常数数据,笔者在开发带拼字检查的电动打字机时就遇到了这种情况。该打字机为了对打出的单词进行正确性检查,必须附带一个词典。词典必须占用ROM空间,所以也必须为词典分配BANK页面。然而,C-51的BANK编译模式中无法解决问题。为此采用代码和数据混合的BANK技术。该技术的操作步骤如下:
    (1)不考虑数据BNAK的存在,仅对程序代码进行BANK方式处理。但要注意,将对数据直接操作的过程模块定位在ROOTBANK中,而对于间接操作数据的过程即可放在ROOTBANK中,也可放在BANK中。
    (2)查看链接后的MAP文件。检查系统自动为代码分配的BANK页面占用情况,由此确定将数据定位在未被系统占用的BANK页面中。
    (3)根据数据被定位的BANK页面,改写直接操作数据的过程。在此过程里程序可直接激活所需要的数据页。
    (4)重新对程序进行编译链接。
5结束语
    C-51的BANK模式由于突破了51系列单片机的64K程序空间的限制,因此具有较高的实用价值。采用这一技术,能够在较低成本下开发本来要用高档CPU才能完成的产品。由于大大降低了产品成本,必然能够为产品带来较高的经济效益。因此该技术具有推广应用价值。


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

《巧用C-51的BANK编译模式》相关文章>>>