巧用C51的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)用過(guò)程在同一個(gè)源程序模塊時(shí),編譯器可知道它們?cè)谕粋€(gè)物理BANK中。這時(shí)編譯器使用非BANK方式產(chǎn)生函數(shù)調(diào)用代碼。
第二種情況是,當(dāng)過(guò)程被說(shuō)明為static類型時(shí),編譯器認(rèn)定所有對(duì)static過(guò)程的調(diào)用均在本程序模塊中,編譯器產(chǎn)生非BANK的調(diào)用方式。
第三種情況是,對(duì)于被說(shuō)明為interrupt的中斷過(guò)程,編譯器總是產(chǎn)生非BANK的調(diào)用方式對(duì)其調(diào)用,因中斷過(guò)程總要放在ROOTBANK中。
第四種情況是,根據(jù)BANK的分配情況,使用nonbanked編譯條件對(duì)源程序中的過(guò)程進(jìn)行說(shuō)明,人為地控制編譯器產(chǎn)生非BANK方式的調(diào)用。
(4)檢查匯編語(yǔ)言程序模塊中是否有對(duì)BANK中過(guò)程的調(diào)用
在由大模式程序向BANK模式轉(zhuǎn)換時(shí),要檢查匯編語(yǔ)言程序中是否有對(duì)BANK中C過(guò)程的調(diào)用。如果匯編程序中有對(duì)C過(guò)程的調(diào)用,必須對(duì)調(diào)用進(jìn)行改寫(xiě),即增加對(duì)BANK切換的操作。
3.3改變編譯、鏈接開(kāi)關(guān)和函數(shù)庫(kù)
3.3.1改變編譯開(kāi)關(guān)
改變編譯開(kāi)關(guān)就是要修改makefike文件中的編譯選項(xiàng)。這里要改變的就是將ml改為mb。對(duì)于放在ROOTBANK中的模塊,其編譯選項(xiàng)中還要增加一項(xiàng)RCODE。
3.3.2改變鏈接開(kāi)關(guān)
改變鏈接開(kāi)關(guān)要在.XCL文件中進(jìn)行。首先在鏈接開(kāi)關(guān)Z選項(xiàng)中增加RCODE,即:
Z(CODE)INTVEC,RCODE,D_CDATA,I_CDATA,CONST=0
該開(kāi)關(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改變庫(kù)函數(shù)
改變庫(kù)函數(shù)就是將大模式下鏈接所需的庫(kù) CL8051L.R03換成BANK模式的庫(kù)函數(shù)CL8051B.R03。而最為重要的就是改寫(xiě)CL8051B.R03中的L18.S03匯編語(yǔ)言模塊。該程序模塊是BANK工作模式下實(shí)現(xiàn)BANK切換的核心。它完成將banknumber送到BANK切換的譯碼電路。這個(gè)模塊要根據(jù)具體的譯碼電路進(jìn)行改寫(xiě)。
4代碼和數(shù)據(jù)的混合BANK技術(shù)
有一些應(yīng)用程序,不僅程序代碼超過(guò)64K,而且還有大量的常數(shù)數(shù)據(jù),筆者在開(kāi)發(fā)帶拼字檢查的電動(dòng)打字機(jī)時(shí)就遇到了這種情況。該打字機(jī)為了對(duì)打出的單詞進(jìn)行正確性檢查,必須附帶一個(gè)詞典。詞典必須占用ROM空間,所以也必須為詞典分配BANK頁(yè)面。然而,C51的 BANK編譯模式中無(wú)法解決問(wèn)題。為此采用代碼和數(shù)據(jù)混合的BANK技術(shù)。該技術(shù)的操作步驟如下:
(1)不考慮數(shù)據(jù)BNAK的存在,僅對(duì)程序代碼進(jìn)行BANK方式處理。但要注意,將對(duì)數(shù)據(jù)直接操作的過(guò)程模塊定位在ROOTBANK中,而對(duì)于間接操作數(shù)據(jù)的過(guò)程即可放在ROOTBANK中,也可放在BANK中。
(2)查看鏈接后的MAP文件。檢查系統(tǒng)自動(dòng)為代碼分配的BANK頁(yè)面占用情況,由此確定將數(shù)據(jù)定位在未被系統(tǒng)占用的BANK頁(yè)面中。
(3)根據(jù)數(shù)據(jù)被定位的BANK頁(yè)面,改寫(xiě)直接操作數(shù)據(jù)的過(guò)程。在此過(guò)程里程序可直接激活所需要的數(shù)據(jù)頁(yè)。
(4)重新對(duì)程序進(jìn)行編譯鏈接。
5結(jié)束語(yǔ)
C51的BANK模式由于突破了51系列單片機(jī)的64K程序空間的限制,因此具有較高的實(shí)用價(jià)值。采用這一技術(shù),能夠在較低成本下開(kāi)發(fā)本來(lái)要用高檔CPU才能完成的產(chǎn)品。由于大大降低了產(chǎn)品成本,必然能夠?yàn)楫a(chǎn)品帶來(lái)較高的經(jīng)濟(jì)效益。因此該技術(shù)具有推廣應(yīng)用價(jià)值。
評(píng)論