黨 蓉,于 丹,姜沫岐
(北京控制工程研究所,北京100190)
BANK編譯模式在擴(kuò)大單片機(jī)程序存儲(chǔ)空間中的應(yīng)用
黨 蓉,于 丹,姜沫岐
(北京控制工程研究所,北京100190)
利用C51編譯器的BANK編譯模式解決MCS-51系列單片機(jī)程序存儲(chǔ)空間受64KB限制的問題,分析Keil C51編譯器在BANK編譯模式下的切換過程,提供一種軟硬件的設(shè)計(jì)方法,并對設(shè)計(jì)的正確性進(jìn)行了驗(yàn)證,從而解決了航天器設(shè)備典型單片機(jī)只能提供16B地址線對程序代碼尋址的問題.
單片機(jī);程序存儲(chǔ)空間;C51編譯器;BANK編譯模式
MCS-51系列單片機(jī)是目前航天器各種電子設(shè)備中應(yīng)用非常廣泛的8位微程序控制器,早期主要用于各種局部終端單元,進(jìn)行數(shù)據(jù)采集、信號(hào)傳輸?shù)?它采用匯編語言進(jìn)行軟件開發(fā),不但程序規(guī)模較小,而且處理任務(wù)也較單一.隨著C51編譯器的出現(xiàn),使得利用高級(jí)語言完成單片機(jī)軟件開發(fā)成為可能,MCS-51系列單片機(jī)也被越來越多地用于功能要求較復(fù)雜的各種場合[1].
C51編譯器的應(yīng)用,使開發(fā)人員得以從繁瑣的匯編程序開發(fā)中解放出來,縮短了軟件的研制周期,而且使程序代碼具有良好的結(jié)構(gòu)性和可維護(hù)性.但相對于匯編語言來說,使用高級(jí)語言開發(fā)的程序占用的存儲(chǔ)空間也大大增加.在使用C51編譯器的過程中,雖然大多數(shù)程序代碼都不超過MCS-51系列單片機(jī)的最大尋址空間,但在某些特殊應(yīng)用情況下,其程序代碼會(huì)超過64KB.為解決MCS-51系列單片機(jī)中代碼受64KB空間限制的問題,C51編譯器提供 BANK編譯模式[2-5].
本文通過對Keil C51編譯器在BANK編譯模式下的切換過程進(jìn)行分析,給出了一種軟硬件的設(shè)計(jì)方法,并對設(shè)計(jì)的正確性進(jìn)行了驗(yàn)證,從而解決了航天器設(shè)備典型單片機(jī)只能提供16位地址線對程序代碼尋址的問題.
C51編譯器的BANK編譯模式對程序存儲(chǔ)器的結(jié)構(gòu)有特殊要求.圖1為在C51編譯器的BANK編譯模式下程序存儲(chǔ)器的物理結(jié)構(gòu)圖.
圖1 BANK編譯模式代碼存儲(chǔ)器的物理結(jié)構(gòu)
在圖1中,代碼地址空間的上半部分,有 n-1個(gè)與BANK0重疊的物理地址空間,硬件需要設(shè)計(jì)n個(gè)存儲(chǔ)器頁面用來存儲(chǔ)程序代碼.在任一時(shí)刻,BANK0~BANK n中只能有1個(gè)BANK處于激活狀態(tài).當(dāng)BANK i處于激活狀態(tài)時(shí),其物理地址空間為BANK Base Addr.~0xFFFF.只有當(dāng) BANK處于激活狀態(tài)時(shí),BANK中的程序代碼才可運(yùn)行[6].
為了對任意BANK中的過程代碼進(jìn)行尋址,C51編譯器為過程調(diào)用分配3個(gè)字節(jié)的BANK基地址(BANK Base Addr.),高字節(jié)為 BANK編號(hào)(BANK Number),次高字節(jié)和低字節(jié)為16位偏移地址(Offset Addr.).基地址是可變的,當(dāng)某過程調(diào)用任意一個(gè)不在同一BANK中的其他區(qū)間時(shí),BANK Number被送到切換BANK的譯碼電路,而16位的偏移地址被送往地址總線,從而實(shí)現(xiàn)在不同BANK之間的過程調(diào)用.
代碼地址空間的下半部分被稱為COMMON區(qū).該區(qū)沒有作 BANK處理,主要用來存放公共程序代碼、C51庫函數(shù)、變量初始化數(shù)據(jù)、中斷服務(wù)程序代碼和 CSTARTUP代碼等[7].
本應(yīng)用實(shí)例中使用的編譯器為 Keil C51,設(shè)計(jì)了兩個(gè)BANK區(qū).采用BANK分區(qū)后的 ROM存儲(chǔ)器地址空間分為兩段,即 0x0000~0xFFFF和0x10000~0x1FFFF.利用單片機(jī)的 I/O口 P1.4,將程序存儲(chǔ)區(qū)分為 BANK0和 BANK1兩個(gè)區(qū),根據(jù)P1.4的高低狀態(tài)確定BANK0或BANK1區(qū)(低電平調(diào)用 BANK0,高電平調(diào)用 BANK1),BANK0和BANK1的基地址分別為6100H和16100H.
當(dāng)程序進(jìn)行函數(shù)間調(diào)用時(shí),由于被調(diào)函數(shù)可能存在于 COMMON區(qū)或任意 BANK區(qū),所以用高級(jí)語言開發(fā)的程序編譯后產(chǎn)生目標(biāo)代碼,其調(diào)用關(guān)系可能存在下列5種情況:
1)任意一個(gè)COMMON區(qū)內(nèi)部函數(shù)的調(diào)用;
2)任意一個(gè)BANK區(qū)內(nèi)部函數(shù)的調(diào)用;
3)BANK區(qū)調(diào)用任意COMMON區(qū)函數(shù);
4)COMMON區(qū)調(diào)用任意BANK區(qū)函數(shù);
5)不同BANK區(qū)之間函數(shù)的調(diào)用.
這5種函數(shù)調(diào)用方式的調(diào)用過程可分為不需要額外的指令支持和需要額外的指令支持兩大類.
(1)不需要額外指令支持的調(diào)用
對于第1種和第2種調(diào)用方式來說,其函數(shù)調(diào)用均與非BANK編譯模式調(diào)用機(jī)理一致,函數(shù)之間的調(diào)用及跳轉(zhuǎn)也不需要增加額外的指令.第3種調(diào)用方式也不需要增加額外的指令.進(jìn)一步分析可知,當(dāng)程序運(yùn)行于某一 BANK區(qū)中,此時(shí)若調(diào)用COMMON區(qū)的函數(shù),則編譯器會(huì)生成LCALL Addr.16指令,自動(dòng)選中與該 BANK區(qū)所對應(yīng)的COMMON函數(shù)起始地址.
(2)需要額外指令支持的調(diào)用
對于第4種和第5種調(diào)用,需要額外的指令支持,并且需要進(jìn)行跳轉(zhuǎn)表維護(hù)、現(xiàn)場保護(hù)及切換操作.對于Keil C51編譯器,調(diào)用過程涉及到3個(gè)部分,分別是跳轉(zhuǎn)表、BANK SELECT段和 BANK SWITCH段,它們均存儲(chǔ)于 COMMON區(qū),其中后面兩個(gè)段是Keil C5l提供的匯編源文件 L51_BANK.A51宏展開后的主要部分.BANK SELECT段用于返回地址以及目標(biāo)地址壓棧工作;BANK SWITCH段用于控制P1.4口輸出切換信號(hào),實(shí)現(xiàn)實(shí)際跳轉(zhuǎn).具體調(diào)用過程分析如下.
1)COMMON區(qū)中BANK函數(shù)調(diào)用
用以下調(diào)用機(jī)理分析假定程序在COMMON1區(qū)調(diào)用BANK1或 BANK0區(qū)函數(shù),而COMMON0區(qū)的調(diào)用機(jī)理與其相同.
a.COMMON1區(qū)調(diào)用 BANK1區(qū)的函數(shù).若在COMMON1區(qū)中調(diào)用BANK1區(qū)的函數(shù),總體過程描述如圖2所示.
圖2 COMMON1與BANK1間的調(diào)用過程
圖2 中:①為主調(diào)用函數(shù)地址壓棧,程序跳至跳轉(zhuǎn)表;②為程序跳至 COMMON1的 BANK SELECT段的標(biāo)志?B_BANK1處,將返回所需的 BANK SWITCH段的標(biāo)志?B_SWTICH1以及目標(biāo)函數(shù)地址壓棧;③為程序跳至 COMMON1的 BANK SWITCH段的標(biāo)志?B_SWTICH1處,這時(shí) P1.4口產(chǎn)生切換操作,輸出高電平;④為程序跳至目標(biāo)BANK1區(qū)的函數(shù)運(yùn)行;⑤為函數(shù)運(yùn)行結(jié)束后,返回 COMMON1區(qū)的 BANK SWITCH段的標(biāo)志?B_SWTICH1處,這時(shí)P1.4口產(chǎn)生切換操作,輸出高電平,維持原狀態(tài);⑥為程序返回至COMMON1區(qū),繼續(xù)運(yùn)行.
b.COMMON1中調(diào)用 BANK0的函數(shù).若在COMMON1區(qū)中調(diào)用BANK0區(qū)的函數(shù),總體過程描述如圖3所示.
圖3 COMMON1與BANK0間的調(diào)用過程
圖3 中:①為主調(diào)用函數(shù)地址壓棧,程序跳至跳轉(zhuǎn)表;②為程序跳至COMMON1區(qū)的BANK SELECT段的標(biāo)志?B_BANK0處,將返回所需的 BANK SWITCH段的標(biāo)志?B_SWTICH0以及目標(biāo)函數(shù)地址壓棧;③為程序跳至 COMMON1區(qū)的 BANK SWITCH段的標(biāo)志?B_SWTICH0處,這時(shí) P1.4口產(chǎn)生切換操作,輸出低電平;④為程序跳至目標(biāo)BANK0區(qū)的函數(shù)運(yùn)行;⑤為函數(shù)運(yùn)行結(jié)束后,返回COMMON0的 BANK SWITCH段的標(biāo)志?B_SWTICH1處,這時(shí)P1.4口產(chǎn)生切換操作,輸出高電平;⑥為程序返回至COMMON1區(qū),繼續(xù)運(yùn)行.
從上述調(diào)用過程可以看出,COMMON1調(diào)用BANK1函數(shù)與COMMON1中調(diào)用BANK0函數(shù)最大的區(qū)別是P1.4口是否發(fā)生切換操作.
2)BANK0與BANK1間的函數(shù)調(diào)用
用以下調(diào)用機(jī)理分析假定程序在BANK1區(qū)調(diào)用BANK0區(qū)函數(shù)、在 BANK0區(qū)調(diào)用 BANK1區(qū)函數(shù)的機(jī)理相同.
若從軟件BANK1區(qū)調(diào)用BANK0區(qū)的函數(shù),總體過程如圖4所示.
圖4 BANK0與BANK1之間的調(diào)用過程
圖4 中:①為主調(diào)用函數(shù)地址壓棧,程序跳至跳轉(zhuǎn)表;②為程序跳至 COMMON1的 BANK SELECT段的標(biāo)志?B_BANK0處,將返回所需的 BANK SWITCH段的標(biāo)志?B_SWTICH0以及目標(biāo)函數(shù)地址壓棧;③為程序跳至 BANK SWITCH段的標(biāo)志?B_SWTICH0處,這時(shí)P1.4口產(chǎn)生切換操作,輸出低電平;④為程序跳至目標(biāo) BANK0區(qū)的函數(shù)運(yùn)行;⑤為函數(shù)運(yùn)行結(jié)束后,返回 COMMON0的 BANK SWITCH段的標(biāo)志?B_SWTICH1處,這時(shí) P1.4口產(chǎn)生切換操作,輸出高電平;⑥為程序返回至BANK1,繼續(xù)運(yùn)行.
進(jìn)一步分析COMMON區(qū)中的BANK區(qū)函數(shù)調(diào)用、BANK0區(qū)與BANK1區(qū)之間的函數(shù)調(diào)用這兩種調(diào)用方式,可知:它們在時(shí)間特性上是一致的,Keil C51編譯器生成的代碼進(jìn)行跨BANK操作需要50個(gè)CPU指令周期.
對于COMMON區(qū)調(diào)用BANK區(qū)函數(shù)方式來說,在調(diào)用目標(biāo)函數(shù)時(shí)需要輸出地址選擇信號(hào),而在返回時(shí)則不需要,這是因?yàn)?COMMON0區(qū)與COMMON1區(qū)固化的是相同的代碼,可以忽略P1.4口的輸出值.
從上述程序調(diào)用過程分析可以看出,進(jìn)行代碼空間規(guī)劃非常重要,在安排程序結(jié)構(gòu)時(shí)以盡量減少BANK之間的切換為原則.
盡可能將經(jīng)常被調(diào)用的公共程序模塊放在COMMON區(qū)中,同時(shí),同一功能模塊的函數(shù)若發(fā)生相互調(diào)用,也應(yīng)盡量安排在相同的BANK區(qū).另外,用匯編語言編寫的程序模塊,一般也放在COMMON中.
本用例中 COMMON區(qū)分配 24.25KB,BANK0與BANK1區(qū)分配39.75KB.COMMON區(qū)中包含復(fù)位和中斷向量、代碼常數(shù)、C51中斷服務(wù)函數(shù)、跳轉(zhuǎn)表及庫函數(shù)等;BANK0和BANK1區(qū)則根據(jù)具體情況分別存放相應(yīng)的代碼.
編譯選項(xiàng)的修改與使用的編譯器有關(guān).本用例使用了Keil C51編譯器,結(jié)合硬件的具體設(shè)計(jì)情況,在L51_BANK.A5l文件中修改如下兩處配置代碼,其他不變.
1)設(shè)置?B_NBANKS為 2;
2)設(shè)置 BANK SWITCH采用單片機(jī) P1.4口操作.
另外,還需要在編譯選項(xiàng)中設(shè)置BANK區(qū)的起始和終止地址.
通過對資源的分析和拷機(jī)試驗(yàn)驗(yàn)證了硬件設(shè)計(jì)和軟件結(jié)構(gòu)規(guī)劃的正確性以及采用BANK編譯模式編譯后跨BANK區(qū)切換的可行性.
由于在進(jìn)行BANK區(qū)間切換操作時(shí),會(huì)占用4個(gè)字節(jié)的堆??臻g,并且公用變量、常量必須放在COMMON區(qū)等緣故,所以本文采用仿真器對程序運(yùn)行過程中的壓棧情況、公用變量及常量進(jìn)行了單步跟蹤及分析,結(jié)果表明堆棧空間滿足要求,公用變量及常量不存在沖突,數(shù)據(jù)傳遞正確.
對軟硬件進(jìn)行了3h的連續(xù)拷機(jī)試驗(yàn),試驗(yàn)結(jié)果表明程序運(yùn)行正常.
本文利用Keil C51的BANK編譯模式進(jìn)行軟硬件聯(lián)合設(shè)計(jì),解決了MCS-51系列單片機(jī)對最大64KB程序空間的限制問題,可供類似應(yīng)用參考.
[1]徐愛鈞,彭秀華.Keil Cx51 V7.0單片機(jī)高級(jí)語言編程與 μVision2應(yīng)用實(shí)踐[M].北京:電子工業(yè)出版社,2006:147-605
[2]Keil Elektronik GmbH and Keil Software Inc.A51 macro assembler and utilities for 8051 and variants[M].[S.l.]Keil Elektronik GmbH and Keil Software Inc,2001:293-304
[3]Keil Elektronik GmbH and Keil Software Inc.GS51 getting started withμVision2[M].[S.l.]Keil Elektronik GmbH and Keil Software Inc,2001:67-68
[4]孫涵芳,徐愛卿.MCS-51系列單片機(jī)原理及應(yīng)用[M].北京:北京航天航空大學(xué)出版社,1994:148-158
[5]周敬利,卓越.MCS-51程序空間擴(kuò)展原理及編譯器優(yōu)化[J].計(jì)算機(jī)工程,2003,29(8):183-185
[6]任克強(qiáng),胡中棟.一種擴(kuò)展MCS-51單片機(jī)程序存儲(chǔ)器地址空間的方法[J].南方冶金學(xué)院學(xué)報(bào),2002,23(9):38-40
[7]黃晴.基于 C51的 BANK編譯器應(yīng)用[J].機(jī)電工程技術(shù),2005,34(8):79-80
Application of BANK Compile Mode in Extending Single Chip Computer Code Space
DANG Rong,YU Dan,JIANG Moqi
(Beijing Institute of Control Engineering,Beijing 100190,China)
Analyzing the switching process of Keil C51 in BANK compile mode,this paper proposes a method using a BANK switching technique to solve the problem that only 64K bytes of code space can be accessed in a single chip computer.On the basis of this analysis,this paper presents and validates a design method on software and hardware,thus solving the problem that the typic 8051 only provides 16 address lines for addressing code space in spacecraft equipments.
single chip computer;code space;C51 complier;BANK switch
TP3
A
1674-1579(2009)04-0044-04
2009-02-27
黨 蓉(1970—),女,陜西人,高級(jí)工程師,研究方向?yàn)橛?jì)算機(jī)及應(yīng)用技術(shù)(e-mail:dang_rong@sina.com.cn).