機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
巧用C51的BANK編譯模式
巧用C51的BANK編譯模式
 更新時(shí)間:2009-9-23 16:18:14  點(diǎn)擊數(shù):0
【字體: 字體顏色
1引言

隨著C51編譯器被廣泛地應(yīng)用于51系列單片機(jī)軟件的開發(fā),大批的開發(fā)人員從繁瑣的匯編語言編程中解放出來。C51不僅縮短了軟件的開發(fā)周期,而且使應(yīng)用軟件具有較好的結(jié)構(gòu)性和可維護(hù)性。在使用C51編譯器的應(yīng)用設(shè)計(jì)中,大多數(shù)程序代碼都不超過51系列單片機(jī)的最大尋址空間64K,但在實(shí)際應(yīng)用中也有程序代碼超出64K的情況。這種情況雖然可以通過更換高檔CPU來解決,但在產(chǎn)品批量較大且對(duì)CPU性能要求并不高時(shí),不希望使用高檔CPU,因?yàn)檫@樣會(huì)增加產(chǎn)品的成本。那么能否在廉價(jià)的51系列單片機(jī)中突破代碼64K空間的限制而進(jìn)行產(chǎn)品的開發(fā)呢?C51編譯器的BANK模式正是為了解決此問題。作者通過對(duì)C51編譯器BANK模式的使用,總結(jié)出一套該模式的使用方法。本文對(duì)這一使用方法進(jìn)行說明,并對(duì)代碼和數(shù)據(jù)混合使用BANK的特殊用法作了介紹。

2BANK的工作方式

C51的BANK模式對(duì)應(yīng)用系統(tǒng)的代碼存儲(chǔ)器結(jié)構(gòu)有特殊要求。圖1為C51BANK模式下代碼存儲(chǔ)器的物理結(jié)構(gòu)。

代碼地址空間的上半部,以重疊BANK0的物理地址空間,硬件設(shè)計(jì)了n個(gè)存儲(chǔ)器頁面來存儲(chǔ)程序代碼。在任一時(shí)刻BANK0~n中,只能有一個(gè)BANK處于激活狀態(tài)。當(dāng)BANKi處于激活狀態(tài)時(shí),其物理地址空間為BankBaseAddr~0xFFFF。只有當(dāng)BANK處于激活狀態(tài)時(shí),BANK中的程序代碼才可以運(yùn)行。為了尋址任意BANK中的過程代碼, C51編譯器為過程調(diào)用生成了如下的BANK地址:

Base地址是可變的,但為譯碼方便,一般選為 8000H。當(dāng)某過程調(diào)用任一不在同一BANK中的其它過程時(shí),BANK地址中的BANKNUMBER被送到切換BANK的譯碼電路,而16位的偏移地址被送往地址總線,從而實(shí)現(xiàn)不同BANK中的過程調(diào)用。下半部分的代碼空間沒有作BANK處理,它被稱為ROOTBANK。這是因?yàn)镃51編譯器僅對(duì)過程調(diào)用產(chǎn)生BANK地址,而對(duì)于過程調(diào)用之外的所有其它部分如CONST等不產(chǎn)生BANK地址,ROOTBANK即用來存放這部分代碼。除此之外, ROOTBANK一般還用來存放下列代碼:C51的庫函數(shù)、所有的變量初始化數(shù)據(jù)、中斷服務(wù)程序代碼、CSTARTUP代碼。編譯器總是以 NONBANK方式對(duì)這一類代碼進(jìn)行操作。

3使用C51BANK模式的步驟

假設(shè)軟件已經(jīng)按C51的大模式進(jìn)行了設(shè)計(jì),那么為了使用C51的BANK模式,要進(jìn)行以下3個(gè)步驟的工作。

3.1設(shè)計(jì)硬件

C51的BANK模式需要硬件來支持。硬件必須設(shè)計(jì)適當(dāng)?shù)淖g碼電路來支持存儲(chǔ)器的頁面結(jié)構(gòu)。盡管C51編譯系統(tǒng)可支持256個(gè)存儲(chǔ)器BANK頁面,但一般的應(yīng)用系統(tǒng)4個(gè)~8個(gè)存儲(chǔ)器頁面即可滿足設(shè)計(jì)要求。在確定了所需存儲(chǔ)器頁面的個(gè)數(shù)后,BANK頁面的譯碼地址位也就確定了。假設(shè)譯碼的地址為n位,那么n與BANK頁面數(shù)的關(guān)系滿足式(1)。

2n≥最大所需的BANK頁面數(shù)n取最小值(1)

支持頁面結(jié)構(gòu)存儲(chǔ)器的譯碼電路,因使用存儲(chǔ)器芯片的空間大小和片數(shù)多少的不同而不同。對(duì)于n位譯碼地址的鎖存,則有兩種方法,最為簡(jiǎn)單的方法是直接使用CPU多余的口線,若沒有多余的口線可用,則需要使用第二種方法,即擴(kuò)展鎖存器對(duì)BANK譯碼地址進(jìn)行鎖存,這時(shí)鎖存器的鎖存地址既可以使用外部RAM空間譯碼產(chǎn)生,也可以用外部ROM空間譯碼產(chǎn)生,如使用 ROM空間譯碼產(chǎn)生,要注意地址不能與代碼可能占用的地址空間沖突。

3.2寫B(tài)ANK模式的源程序

C51BANK模式下的源程序與大模式下的源程序沒有太大區(qū)別,只是在BANK模式下要注意以下幾點(diǎn):

(1)合理規(guī)劃代碼空間

規(guī)劃代碼空間就是決定哪一部分代碼放在ROOTBANK 中,哪一部分代碼放在BANK中。前面已經(jīng)提到,有幾種類型代碼是必須放在ROOTBANK中的,而對(duì)于其它代碼來說,既可以放在BANK中,也可以放在 ROOTBANK,但為了提高系統(tǒng)的運(yùn)行效率,對(duì)經(jīng)常被調(diào)用的公共程序模塊,應(yīng)盡可能放在ROOTBANK中,以減少BANK的切換。而對(duì)于用匯編語言編寫的程序模塊,如果將其放在BANK中,則需要人工在匯編程序中添加對(duì)BANK切換的操作,這項(xiàng)工作非常繁瑣,因此用匯編語言編寫的程序模塊,一般也放在 ROOTBANK中。

(2)檢查源程序模塊大小

任一個(gè)C程序模塊,在編譯時(shí)都要生成一個(gè)CODE段,而 linker不可能把一個(gè)模塊的CODE分配到多個(gè)BANK中,因此每個(gè)程序模塊的大小都必須小于或等于一個(gè)BANK空間,否則就要把一個(gè)程序模塊分為兩個(gè)或多個(gè)模塊。只要不超出BANK的空間,linker可以把多個(gè)程序模塊的代碼放入一個(gè)BANK中,由此看出將每個(gè)程序模塊最小化,便可以充分利用 BANK的空間資源。

(3)充分利用非BANK的調(diào)用

在BANK模式中,當(dāng)編譯器不知道調(diào)用與被調(diào)用是否在同一個(gè)BANK時(shí),就會(huì)按照BANK調(diào)用方式產(chǎn)生程序代碼。但在下列4種情況中,編譯器能夠知道調(diào)用與被調(diào)用是否處在一個(gè)物理BANK中。這時(shí)編譯器將產(chǎn)生空間少、速度快的非BANK調(diào)用的程序代碼。

第一種情況是,當(dāng)調(diào)用與被調(diào)用過程在同一個(gè)源程序模塊時(shí),編譯器可知道它們?cè)谕粋(gè)物理BANK中。這時(shí)編譯器使用非BANK方式產(chǎn)生函數(shù)調(diào)用代碼。

第二種情況是,當(dāng)過程被說明為static類型時(shí),編譯器認(rèn)定所有對(duì)static過程的調(diào)用均在本程序模塊中,編譯器產(chǎn)生非BANK的調(diào)用方式。

第三種情況是,對(duì)于被說明為interrupt的中斷過程,編譯器總是產(chǎn)生非BANK的調(diào)用方式對(duì)其調(diào)用,因中斷過程總要放在ROOTBANK中。

第四種情況是,根據(jù)BANK的分配情況,使用nonbanked編譯條件對(duì)源程序中的過程進(jìn)行說明,人為地控制編譯器產(chǎn)生非BANK方式的調(diào)用。

(4)檢查匯編語言程序模塊中是否有對(duì)BANK中過程的調(diào)用

在由大模式程序向BANK模式轉(zhuǎn)換時(shí),要檢查匯編語言程序中是否有對(duì)BANK中C過程的調(diào)用。如果匯編程序中有對(duì)C過程的調(diào)用,必須對(duì)調(diào)用進(jìn)行改寫,即增加對(duì)BANK切換的操作。

3.3改變編譯、鏈接開關(guān)和函數(shù)庫

3.3.1改變編譯開關(guān)

改變編譯開關(guān)就是要修改makefike文件中的編譯選項(xiàng)。這里要改變的就是將ml改為mb。對(duì)于放在ROOTBANK中的模塊,其編譯選項(xiàng)中還要增加一項(xiàng)RCODE。

3.3.2改變鏈接開關(guān)

改變鏈接開關(guān)要在.XCL文件中進(jìn)行。首先在鏈接開關(guān)Z選項(xiàng)中增加RCODE,即:

Z(CODE)INTVEC,RCODE,D_CDATA,I_CDATA,CONST=0

該開關(guān)用于列出除CODE段之外的所有段的排放次序。

除了進(jìn)行上面的修改外,還要增加如下的鏈接選項(xiàng):

A表示bank_number的起始值是0

B表示bank的16位偏移地址起始值為8000H

C表示CODE段應(yīng)放入2000H字節(jié)長(zhǎng)度的BANK中

D表示bank_number應(yīng)按0001H的步長(zhǎng)增加

E表示bank的16位偏移地址按0000H步長(zhǎng)增加,這意味著對(duì)任意bank,其16位偏移地址總為8000H

3.3.3改變庫函數(shù)

改變庫函數(shù)就是將大模式下鏈接所需的庫 CL8051L.R03換成BANK模式的庫函數(shù)CL8051B.R03。而最為重要的就是改寫CL8051B.R03中的L18.S03匯編語言模塊。該程序模塊是BANK工作模式下實(shí)現(xiàn)BANK切換的核心。它完成將banknumber送到BANK切換的譯碼電路。這個(gè)模塊要根據(jù)具體的譯碼電路進(jìn)行改寫。

4代碼和數(shù)據(jù)的混合BANK技術(shù)

有一些應(yīng)用程序,不僅程序代碼超過64K,而且還有大量的常數(shù)數(shù)據(jù),筆者在開發(fā)帶拼字檢查的電動(dòng)打字機(jī)時(shí)就遇到了這種情況。該打字機(jī)為了對(duì)打出的單詞進(jìn)行正確性檢查,必須附帶一個(gè)詞典。詞典必須占用ROM空間,所以也必須為詞典分配BANK頁面。然而,C51的BANK編譯模式中無法解決問題。為此采用代碼和數(shù)據(jù)混合的BANK技術(shù)。該技術(shù)的操作步驟如下:

(1)不考慮數(shù)據(jù)BNAK的存在,僅對(duì)程序代碼進(jìn)行BANK方式處理。但要注意,將對(duì)數(shù)據(jù)直接操作的過程模塊定位在ROOTBANK中,而對(duì)于間接操作數(shù)據(jù)的過程即可放在ROOTBANK中,也可放在BANK中。

(2)查看鏈接后的MAP文件。檢查系統(tǒng)自動(dòng)為代碼分配的BANK頁面占用情況,由此確定將數(shù)據(jù)定位在未被系統(tǒng)占用的BANK頁面中。

(3)根據(jù)數(shù)據(jù)被定位的BANK頁面,改寫直接操作數(shù)據(jù)的過程。在此過程里程序可直接激活所需要的數(shù)據(jù)頁。

(4)重新對(duì)程序進(jìn)行編譯鏈接。

5結(jié)束語

C51的BANK模式由于突破了51系列單片機(jī)的64K程序空間的限制,因此具有較高的實(shí)用價(jià)值。采用這一技術(shù),能夠在較低成本下開發(fā)本來要用高檔CPU才能完成的產(chǎn)品。由于大大降低了產(chǎn)品成本,必然能夠?yàn)楫a(chǎn)品帶來較高的經(jīng)濟(jì)效益。因此該技術(shù)具有推廣應(yīng)用價(jià)值。

  • 上一篇: MCU為電動(dòng)自行車提供有效的驅(qū)動(dòng)
  • 下一篇: 沒有了
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1