<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 巧用C51的BANK編譯模式

巧用C51的BANK編譯模式

作者: 時(shí)間:2012-02-15 來(lái)源:網(wǎng)絡(luò ) 收藏
1引言

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

2BANK的工作方式

C51的BANK模式對應用系統的代碼存儲器結構有特殊要求。圖1為C51BANK模式下代碼存儲器的物理結構。

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

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

3使用C51BANK模式的步驟

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

3.1設計硬件

C51的BANK模式需要硬件來(lái)支持。硬件必須設計適當的譯碼電路來(lái)支持存儲器的頁(yè)面結構。盡管C51編譯系統可支持256個(gè)存儲器BANK頁(yè)面,但一般的應用系統4個(gè)~8個(gè)存儲器頁(yè)面即可滿(mǎn)足設計要求。在確定了所需存儲器頁(yè)面的個(gè)數后,BANK頁(yè)面的譯碼地址位也就確定了。假設譯碼的地址為n位,那么n與BANK頁(yè)面數的關(guān)系滿(mǎn)足式(1)。

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

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

3.2寫(xiě)BANK模式的源程序

C51BANK模式下的源程序與大模式下的源程序沒(méi)有太大區別,只是在BANK模式下要注意以下幾點(diǎn):

(1)合理規劃代碼空間

規劃代碼空間就是決定哪一部分代碼放在ROOTBANK 中,哪一部分代碼放在BANK中。前面已經(jīng)提到,有幾種類(lèi)型代碼是必須放在ROOTBANK中的,而對于其它代碼來(lái)說(shuō),既可以放在BANK中,也可以放在 ROOTBANK,但為了提高系統的運行效率,對經(jīng)常被調用的公共程序模塊,應盡可能放在ROOTBANK中,以減少BANK的切換。而對于用匯編語(yǔ)言編寫(xiě)的程序模塊,如果將其放在BANK中,則需要人工在匯編程序中添加對BANK切換的操作,這項工作非常繁瑣,因此用匯編語(yǔ)言編寫(xiě)的程序模塊,一般也放在 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的空間資源。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 51 BANK 編譯模式

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>