| | 首页 | 文章中心 | 下载中心 | 本站特供 | 软硬件结合论坛 | 软硬件结合博客 | | |
![]() | |
| 您现在的位置: 中国软硬件结合技术网 >> 文章中心 >> 硬件技术 >> EDA软件 >> 正文 |
|
|||||
| 巧用C51的BANK编译模式 | |||||
| 作者:佚名 文章来源: 点击数: 更新时间:2006-9-10 | |||||
| 1引言 随着C51编译器被广泛地应用于51系列单片机软件的开发,大批的开发人员从繁琐的汇编语言编程中解放出来。C51不仅缩短了软件的开发周期,而且使应用软件具有较好的结构性和可维护性。在使用C51编译器的应用设计中,大多数程序代码都不超过51系列单片机的最大寻址空间64K,但在实际应用中也有程序代码超出64K的情况。这种情况虽然可以通过更换高档CPU来解决,但在产品批量较大且对CPU性能要求并不高时,不希望使用高档CPU,因为这样会增加产品的成本。那么能否在廉价的51系列单片机中突破代码64K空间的限制而进行产品的开发呢?C51编译器的BANK模式正是为了解决此问题。作者通过对C51编译器BANK模式的使用,总结出一套该模式的使用方法。本文对这一使用方法进行说明,并对代码和数据混合使用BANK的特殊用法作了介绍。 2BANK的工作方式 C51的BANK模式对应用系统的代码存储器结构有特殊要求。图1为C51BANK模式下代码存储器的物理结构。 代码地址空间的上半部,以重叠BANK0的物理地址空间,硬件设计了n个存储器页面来存储程序代码。在任一时刻BANK0~n中,只能有一个BANK处于激活状态。当BANKi处于激活状态时,其物理地址空间为BankBaseAddr~0xFFFF。只有当BANK处于激活状态时,BANK中的程序代码才可以运行。为了寻址任意BANK中的过程代码,C51编译器为过程调用生成了如下的BANK地址: Base地址是可变的,但为译码方便,一般选为8000H。当某过程调用任一不在同一BANK中的其它过程时,BANK地址中的BANKNUMBER被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现不同BANK中的过程调用。下半部分的代码空间没有作BANK处理,它被称为ROOTBANK。这是因为C51编译器仅对过程调用产生BANK地址,而对于过程调用之外的所有其它部分如CONST等不产生BANK地址,ROOTBANK即用来存放这部分代码。除此之外,ROOTBANK一般还用来存放下列代码:C51的库函数、所有的变量初始化数据、中断服务程序代码、CSTARTUP代码。编译器总是以NONBANK方式对这一类代码进行操作。 3使用C51BANK模式的步骤 假设软件已经按C51的大模式进行了设计,那么为了使用C51的BANK模式,要进行以下3个步骤的工作。 3.1设计硬件 C51的BANK模式需要硬件来支持。硬件必须设计适当的译码电路来支持存储器的页面结构。尽管C51编译系统可支持256个存储器BANK页面,但一般的应用系统4个~8个存储器页面即可满足设计要求。在确定了所需存储器页面的个数后,BANK页面的译码地址位也就确定了。假设译码的地址为n位,那么n与BANK页面数的关系满足式(1)。 2n≥最大所需的BANK页面数n取最小值(1) 支持页面结构存储器的译码电路,因使用存储器芯片的空间大小和片数多少的不同而不同。对于n位译码地址的锁存,则有两种方法,最为简单的方法是直接使用CPU多余的口线,若没有多余的口线可用,则需要使用第二种方法,即扩展锁存器对BANK译码地址进行锁存,这时锁存器的锁存地址既可以使用外部RAM空间译码产生,也可以用外部ROM空间译码产生,如使用ROM空间译码产生,要注意地址不能与代码可能占用的地址空间冲突。 3.2写BANK模式的源程序 C51BANK模式下的源程序与大模式下的源程序没有太大区别,只是在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的分配情况,使用nonbanked编译条件对源程序中的过程进行说明,人为地控制编译器产生非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切换的核心。它完成将banknumber送到BANK切换的译码电路。这个模块要根据具体的译码电路进行改写。 4代码和数据的混合BANK技术 有一些应用程序,不仅程序代码超过64K,而且还有大量的常数数据,笔者在开发带拼字检查的电动打字机时就遇到了这种情况。该打字机为了对打出的单词进行正确性检查,必须附带一个词典。词典必须占用ROM空间,所以也必须为词典分配BANK页面。然而,C51的BANK编译模式中无法解决问题。为此采用代码和数据混合的BANK技术。该技术的操作步骤如下: (1)不考虑数据BNAK的存在,仅对程序代码进行BANK方式处理。但要注意,将对数据直接操作的过程模块定位在ROOTBANK中,而对于间接操作数据的过程即可放在ROOTBANK中,也可放在BANK中。 (2)查看链接后的MAP文件。检查系统自动为代码分配的BANK页面占用情况,由此确定将数据定位在未被系统占用的BANK页面中。 (3)根据数据被定位的BANK页面,改写直接操作数据的过程。在此过程里程序可直接激活所需要的数据页。 (4)重新对程序进行编译链接。 5结束语 C51的BANK模式由于突破了51系列单片机的64K程序空间的限制,因此具有较高的实用价值。采用这一技术,能够在较低成本下开发本来要用高档CPU才能完成的产品。由于大大降低了产品成本,必然能够为产品带来较高的经济效益。因此该技术具有推广应用价值。 |
|||||
| 文章录入:ycxms88 责任编辑:Polylove | |||||
| 【发表评论】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| 没有相关文章 |
| |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | | |
![]() |
Copyright ©2004 - 2006 中国软硬件结合技术网 91tech.net 91tech.cn 91tech.com 站长:Polylove |