随着C51编译器被广泛地应用于51系列单片机软件的开发,大批的开发人员从繁琐的汇编语言编程中解放出来。C51不仅缩短了软件的开发周期,而且使应用软件具有较好的结构性和可维护性。在使用C51编译器的应用设计中,大多数程序代码都不超过51系列单片机的最大寻址空间64K,但在实际应用中也有程序代码超出64K的情况。这种情况虽然可以通过更换高档CPU来解决,但在产品批量较大且对CPU性能要求并不高时,不希望使用高档CPU,因为这样会增加产品的成本。那么能否在廉价的51系列单片机中突破代码64K空间的限制而进行产品的开发呢?C51编译器的BANK模式正是为了解决此问题。作者通过对C51编译器BANK模式的使用,总结出一套该模式的使用方法。本文对这一使用方法进行说明,并对代码和数据混合使用BANK的特殊用法作了介绍。电子园51单片机学习网9M(\N#`0J l l9P\SM:~G
V_?!CRI446062BANK的工作方式
9X1JG+\4[44606;|A*zY*]2h(F4s+\44606C51的BANK模式对应用系统的代码存储器结构有特殊要求。图1为C51BANK模式下代码存储器的物理结构。电子园51单片机学习网+E%wq:ka4p7wn ?
电子园51单片机学习网'lb@&Z[job
电子园51单片机学习网([!b;z W UF2I
代码地址空间的上半部,以重叠BANK0的物理地址空间,硬件设计了n个存储器页面来存储程序代码。在任一时刻BANK0~n中,只能有一个BANK处于激活状态。当BANKi处于激活状态时,其物理地址空间为BankBaseAddr~0xFFFF。只有当BANK处于激活状态时,BANK中的程序代码才可以运行。为了寻址任意BANK中的过程代码, C51编译器为过程调用生成了如下的BANK地址:电子园51单片机学习网2WG#b"fl&i
Xv!LB){jj:~ p44606电子园51单片机学习网{LdyZe!R0d8? z!hi|?
Base地址是可变的,但为译码方便,一般选为 8000H。当某过程调用任一不在同一BANK中的其它过程时,BANK地址中的BANKNUMBER被送到切换BANK的译码电路,而16位的偏移地址被送往地址总线,从而实现不同BANK中的过程调用。下半部分的代码空间没有作BANK处理,它被称为ROOTBANK。这是因为C51编译器仅对过程调用产生BANK地址,而对于过程调用之外的所有其它部分如CONST等不产生BANK地址,ROOTBANK即用来存放这部分代码。除此之外, ROOTBANK一般还用来存放下列代码:C51的库函数、所有的变量初始化数据、中断服务程序代码、CSTARTUP代码。编译器总是以 NONBANK方式对这一类代码进行操作。
t Z"ZY!{2sM446062]L+V/O{446063使用C51BANK模式的步骤电子园51单片机学习网0k'B;n GiY&E+cJ3p
]4x0DI[)V'|Q44606假设软件已经按C51的大模式进行了设计,那么为了使用C51的BANK模式,要进行以下3个步骤的工作。电子园51单片机学习网2hF2s}S#g,L3p SM;~
电子园51单片机学习网c H4W%VbU'[3.1设计硬件电子园51单片机学习网j9["c\C4b9\
电子园51单片机学习网N%mD(nX+YlC51的BANK模式需要硬件来支持。硬件必须设计适当的译码电路来支持存储器的页面结构。尽管C51编译系统可支持256个存储器BANK页面,但一般的应用系统4个~8个存储器页面即可满足设计要求。在确定了所需存储器页面的个数后,BANK页面的译码地址位也就确定了。假设译码的地址为n位,那么n与BANK页面数的关系满足式(1)。电子园51单片机学习网T4p;eRD \
;S(NS3_4Xy"F T446062n≥最大所需的BANK页面数n取最小值(1)
.gh_cc44606 电子园51单片机学习网.Z8^ m KQt2NE#y支持页面结构存储器的译码电路,因使用存储器芯片的空间大小和片数多少的不同而不同。对于n位译码地址的锁存,则有两种方法,最为简单的方法是直接使用CPU多余的口线,若没有多余的口线可用,则需要使用第二种方法,即扩展锁存器对BANK译码地址进行锁存,这时锁存器的锁存地址既可以使用外部RAM空间译码产生,也可以用外部ROM空间译码产生,如使用 ROM空间译码产生,要注意地址不能与代码可能占用的地址空间冲突。电子园51单片机学习网(GVbl9m iDf
Q-U5o0Z^446063.2写BANK模式的源程序
:IL @%n*Xt44606VKv Pu+\2qY44606C51BANK模式下的源程序与大模式下的源程序没有太大区别,只是在BANK模式下要注意以下几点:电子园51单片机学习网S_)Vl{!x k
X"nFa4H.s.Y)e3jNe44606(1)合理规划代码空间电子园51单片机学习网} }4E)w.|j
电子园51单片机学习网Kt:W*z!IzN规划代码空间就是决定哪一部分代码放在ROOTBANK 中,哪一部分代码放在BANK中。前面已经提到,有几种类型代码是必须放在ROOTBANK中的,而对于其它代码来说,既可以放在BANK中,也可以放在 ROOTBANK,但为了提高系统的运行效率,对经常被调用的公共程序模块,应尽可能放在ROOTBANK中,以减少BANK的切换。而对于用汇编语言编写的程序模块,如果将其放在BANK中,则需要人工在汇编程序中添加对BANK切换的操作,这项工作非常繁琐,因此用汇编语言编写的程序模块,一般也放在 ROOTBANK中。
9L"Iz|.q44606-Jt!y`R44606(2)检查源程序模块大小
r$S[,c-ff44606A(E+sS&rf1B7@%r44606任一个C程序模块,在编译时都要生成一个CODE段,而 linker不可能把一个模块的CODE分配到多个BANK中,因此每个程序模块的大小都必须小于或等于一个BANK空间,否则就要把一个程序模块分为两个或多个模块。只要不超出BANK的空间,linker可以把多个程序模块的代码放入一个BANK中,由此看出将每个程序模块最小化,便可以充分利用 BANK的空间资源。电子园51单片机学习网,r{#`g:}qW8w
电子园51单片机学习网Z3S(w,x-Cs6}c~(3)充分利用非BANK的调用
eP2gJS44606-K:t1xzVB"R4S%~-y44606在BANK模式中,当编译器不知道调用与被调用是否在同一个BANK时,就会按照BANK调用方式产生程序代码。但在下列4种情况中,编译器能够知道调用与被调用是否处在一个物理BANK中。这时编译器将产生空间少、速度快的非BANK调用的程序代码。
?-w9K.vL44606 电子园51单片机学习网5eq6KtZh,n第一种情况是,当调用与被调用过程在同一个源程序模块时,编译器可知道它们在同一个物理BANK中。这时编译器使用非BANK方式产生函数调用代码。电子园51单片机学习网#w"N,};_2S
电子园51单片机学习网Y~\c(WG7J第二种情况是,当过程被说明为static类型时,编译器认定所有对static过程的调用均在本程序模块中,编译器产生非BANK的调用方式。
~ zz$E7C3~)x44606 电子园51单片机学习网_;wQ p6rX第三种情况是,对于被说明为interrupt的中断过程,编译器总是产生非BANK的调用方式对其调用,因中断过程总要放在ROOTBANK中。电子园51单片机学习网m*Q8{%x7jso
er!\-gJZm44606第四种情况是,根据BANK的分配情况,使用nonbanked编译条件对源程序中的过程进行说明,人为地控制编译器产生非BANK方式的调用。
Ng\2M!c|Ppiv44606x cM.b4o}44606(4)检查汇编语言程序模块中是否有对BANK中过程的调用
w,e(e7cW;op44606 电子园51单片机学习网%k7G8M p;TC| iJ1L)g在由大模式程序向BANK模式转换时,要检查汇编语言程序中是否有对BANK中C过程的调用。如果汇编程序中有对C过程的调用,必须对调用进行改写,即增加对BANK切换的操作。
J$`q X!OW'Q:P44606dH,}*e(]FWr*{446063.3改变编译、链接开关和函数库电子园51单片机学习网 }3^5ffu mJ!c e!_
电子园51单片机学习网6[P1Op*Z%K:eJ'j#F"f#p3.3.1改变编译开关电子园51单片机学习网Ry(U(rDt
X1V%GZ*k^&^44606改变编译开关就是要修改makefike文件中的编译选项。这里要改变的就是将ml改为mb。对于放在ROOTBANK中的模块,其编译选项中还要增加一项RCODE。电子园51单片机学习网f8@br|0B`
电子园51单片机学习网4n*KWYej@q[J3.3.2改变链接开关
!p7n4Z%w6ng1MH44606 电子园51单片机学习网 e @ Vj+c+|+x改变链接开关要在.XCL文件中进行。首先在链接开关Z选项中增加RCODE,即:电子园51单片机学习网%w kWD-L;d W g&M
6P@kVJ/f44606Z(CODE)INTVEC,RCODE,D_CDATA,I_CDATA,CONST=0
;?g @D2R*_446060p9PLmhPK44606该开关用于列出除CODE段之外的所有段的排放次序。
/N?LWdGW44606 电子园51单片机学习网 bfr-RgOm除了进行上面的修改外,还要增加如下的链接选项:电子园51单片机学习网!?+Bk9}Xd
axY_'N4Aq,C44606A表示bank_number的起始值是0电子园51单片机学习网U ^ j6Tn&h$W!}:E
4r/SF6mq*yH uZNz44606B表示bank的16位偏移地址起始值为8000H
/E8{jsLrc#O,R44606]Bw;u'Q+lY#R44606C表示CODE段应放入2000H字节长度的BANK中
u2X@2AO/b44606 电子园51单片机学习网Qo Ig:V&VD表示bank_number应按0001H的步长增加
|(o!^ R'HK/g$zt"{44606I;^.e#KcQD2o$x~8Tj44606E表示bank的16位偏移地址按0000H步长增加,这意味着对任意bank,其16位偏移地址总为8000H电子园51单片机学习网w1H9[k {
&u FZ2? w@0E7k$i!q^446063.3.3改变库函数
r"Q"G @ic-bpO44606 电子园51单片机学习网_8cph Ig w f改变库函数就是将大模式下链接所需的库 CL8051L.R03换成BANK模式的库函数CL8051B.R03。而最为重要的就是改写CL8051B.R03中的L18.S03汇编语言模块。该程序模块是BANK工作模式下实现BANK切换的核心。它完成将banknumber送到BANK切换的译码电路。这个模块要根据具体的译码电路进行改写。电子园51单片机学习网W8A#W(wSD!s
Q(a8tJ)y8G,OF446064代码和数据的混合BANK技术电子园51单片机学习网CUGK@
d\u&D$a)c44606有一些应用程序,不仅程序代码超过64K,而且还有大量的常数数据,笔者在开发带拼字检查的电动打字机时就遇到了这种情况。该打字机为了对打出的单词进行正确性检查,必须附带一个词典。词典必须占用ROM空间,所以也必须为词典分配BANK页面。然而,C51的BANK编译模式中无法解决问题。为此采用代码和数据混合的BANK技术。该技术的操作步骤如下:电子园51单片机学习网!N,h oD'fI$R S/h2h
l~,M$q'oU H44606(1)不考虑数据BNAK的存在,仅对程序代码进行BANK方式处理。但要注意,将对数据直接操作的过程模块定位在ROOTBANK中,而对于间接操作数据的过程即可放在ROOTBANK中,也可放在BANK中。电子园51单片机学习网e5c?s(n^8K
电子园51单片机学习网#J ?D#nSHy@c U+Hb co(2)查看链接后的MAP文件。检查系统自动为代码分配的BANK页面占用情况,由此确定将数据定位在未被系统占用的BANK页面中。电子园51单片机学习网+uD'yEH&z"O
电子园51单片机学习网 n {2My6k4f8D"M(3)根据数据被定位的BANK页面,改写直接操作数据的过程。在此过程里程序可直接激活所需要的数据页。电子园51单片机学习网3LB)|F1ZG
@7`'x cxKMR |4]6m6~44606(4)重新对程序进行编译链接。
"ZZ pp K44606 电子园51单片机学习网\!U2S-R PF5结束语
lD#M]g%lX44606 电子园51单片机学习网 x? B/lQ,f1q frCkC51的BANK模式由于突破了51系列单片机的64K程序空间的限制,因此具有较高的实用价值。采用这一技术,能够在较低成本下开发本来要用高档CPU才能完成的产品。由于大大降低了产品成本,必然能够为产品带来较高的经济效益。因此该技术具有推广应用价值。
(y0rdFS P44606
文章评论(0条评论)
登录后参与讨论