首页 | 文章中心 | 下载中心 | 本站特供 | 软硬件结合论坛 | 软硬件结合博客 | 
您现在的位置: 中国软硬件结合技术网 >> 文章中心 >> 硬件技术 >> EDA软件 >> 正文 用户登录 新用户注册
[推荐]巧用C51的BANK编译模式          【字体:
巧用C51的BANK编译模式
作者:佚名    文章来源:    点击数:    更新时间:2006-9-10
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才能完成的产品。由于大大降低了产品成本,必然能够为产品带来较高的经济效益。因此该技术具有推广应用价值。
文章录入:ycxms88    责任编辑:Polylove 
  • 上一篇文章: PCB设计流程(新手必读)

  • 下一篇文章: 没有了
  • 发表评论】【告诉好友】【打印此文】【关闭窗口
          最新热点       最新推荐       相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)