2.2.單片機嵌入式系統(tǒng)程序存儲區(qū)擴展 
  
    受虛擬存儲系統(tǒng)啟發(fā),我們把上述方法作了一些修改以應(yīng)用于嵌入式系統(tǒng)中。由于系統(tǒng)設(shè)計選用的外部程序存儲器容量為256k,而一般單片機(如 8051系列)的尋址空間為64k,為簡單起見,以64k為一頁,將256k虛擬地址分為4頁映射到單片機的64k空間。嵌入式系統(tǒng)中地址變換機構(gòu)可被簡化:單片機沒有專用的頁表基址寄存器,可以通過額外的端口線(如P1.0,P1.1,P1.2等)作為基址指定不同的頁面,頁表查詢可用一個跳轉(zhuǎn)表實現(xiàn)。然而頁面切換前后必須保證能夠正確訪問到跳轉(zhuǎn)表,因此所有64k頁面都需要有一個完全相同的代碼段用來存放跳轉(zhuǎn)表和中斷矢量等公共資源。



    為提高存儲器利用率可采用圖2所示的結(jié)構(gòu),其中公共段中存放了高32k段之間相互調(diào)用所需要的跳轉(zhuǎn)表。各段相互調(diào)用之前應(yīng)先跳轉(zhuǎn)到公共段,執(zhí)行頁面切換后再跳轉(zhuǎn)到被調(diào)用程序的入口,這就實現(xiàn)了18位虛擬地址到16位主存地址的變換。不妨以P1.0,P1.1,P1.2作為頁面基址來指定不同的頁,相應(yīng)的跳轉(zhuǎn)表程序結(jié)構(gòu)如下:



    在公共段(256k存儲芯片的低32k)中存放操作系統(tǒng)和提供給用戶的其他庫函數(shù),其他各段用來存放嵌入式系統(tǒng)的用戶程序。采用圖2結(jié)構(gòu)的單片機與存儲器接口原理圖如圖3所示。其中A0~A15地址線接法與普通存儲器擴展方法相同。



    以上考慮了復(fù)位時頁面應(yīng)切換到公共代碼區(qū)。 
  
    Keil C51編譯器是單片機開發(fā)應(yīng)用中非常流行的一種高效編譯器,它支持上述頁面分組技術(shù)。 
  
    2.3.單片機嵌入式系統(tǒng)數(shù)據(jù)存儲區(qū)擴展 
  
    嵌入式系統(tǒng)中引入操作系統(tǒng)需要增加一定的數(shù)據(jù)存儲器開銷,必要時仍可以采用分頁技術(shù)擴展數(shù)據(jù)存儲區(qū)容量。 
  
    引入操作系統(tǒng)以后,數(shù)據(jù)區(qū)有兩種組織方法,比較簡單的一種方法是操作系統(tǒng)與用戶程序共用一個數(shù)據(jù)區(qū),編譯器將整個程序一起編譯,不必區(qū)分是系統(tǒng)程序還是用戶程序。但這樣對用戶來說操作系統(tǒng)變得不透明了,而且不良的用戶程序可能會破壞系統(tǒng)的數(shù)據(jù)區(qū),導(dǎo)致整個系統(tǒng)崩潰。 
  
    相對應(yīng)的另一種方法是給操作系統(tǒng)與用戶程序分別分配獨立的數(shù)據(jù)區(qū),譬如將128k 數(shù)據(jù)存儲器給操作系統(tǒng)和用戶程序各分配64k。不幸地是,當(dāng)操作系統(tǒng)與用戶程序一起編譯時,編譯器會自動給它們分配不同的地址,這樣即使存儲器物理上是分開的,操作系統(tǒng)與用戶程序的數(shù)據(jù)區(qū)還是無法地址復(fù)用,這極大地浪費了地址空間;而且對傳統(tǒng)的單片機, Keil C 編譯器最大只支持64k數(shù)據(jù)區(qū),幸運地是,這個矛盾可以通過采用虛擬接口的方法加以解決。 
  
    為此,將公共代碼段中的程序單獨編譯,并且在鏈接、定位目標(biāo)代碼時,給操作系統(tǒng)和公共庫函數(shù)的每個函數(shù)在0x0000~0x7FFFH內(nèi)分別指定一個固定的首地址。鑒于用戶程序可能調(diào)用這些函數(shù),需要為這些函數(shù)分別編寫一個相同類型的同名偽函數(shù),每個偽函數(shù)僅包含一條到真實函數(shù)(入口地址已知)的轉(zhuǎn)移指令,所有這些函數(shù)都存放在一個被稱為虛擬接口的頭文件中。虛擬接口文件與用戶程序一起編譯,完成用戶程序與操作系統(tǒng)兩次編譯的接口。顯然這種方法僅占用了用戶區(qū)的極少量代碼空間,而絲毫沒有浪費用戶數(shù)據(jù)區(qū),同時又實現(xiàn)了地址復(fù)用。 
  
    公共代碼段和操作系統(tǒng)的數(shù)據(jù)區(qū)特殊的對應(yīng)關(guān)系(見圖4),很容易通過P2端口線來指定。由單片機外部程序區(qū)訪問時序(圖 5)可知,PSEN的上升沿后數(shù)據(jù)總線A0~A7上開始出現(xiàn)指令或指令操作數(shù),此時的地址線A15指示當(dāng)前訪問的是公共代碼段(對應(yīng)數(shù)據(jù)區(qū)高64k)還是其他程序段(對應(yīng)數(shù)據(jù)區(qū)低64k),因此在PSEN上升沿鎖存地址線A15,用它可以選擇不同的數(shù)據(jù)存儲器空間。





    3、存儲系統(tǒng)的性能分析 
  
    本文基于虛擬存儲系統(tǒng)思想實現(xiàn)了嵌入式系統(tǒng)中大容量存儲器的擴展。不難看出系統(tǒng)的擴展余地受端口線的限制。由于在同一塊芯片中構(gòu)造圖2所示的結(jié)構(gòu),需要多使用一根端口線,因此對于8051系列使用整個P1口可以將系統(tǒng)的程序虛擬空間擴展至8M字節(jié)。數(shù)據(jù)存儲區(qū)擴展的最大容量還與程序在編譯時所被分成塊的數(shù)目有關(guān),最大可達(dá)16M字節(jié),這在單片機嵌入式系統(tǒng)中已經(jīng)是足夠大了。 
  
    程序在調(diào)用不同頁面的函數(shù)時需要額外的軟件切換周期,頻繁的頁面切換會降低系統(tǒng)的性能,因此編譯時應(yīng)仔細(xì)選擇函數(shù),盡可能將相關(guān)的函數(shù)分配在同一頁中。 
  
    數(shù)據(jù)存儲區(qū)切換是由硬件實現(xiàn)的,頁面切換并不降低系統(tǒng)性能。由于操作系統(tǒng)與用戶程序數(shù)據(jù)區(qū)相互獨立,對用戶來說整個64k空間都是可用的,這就增加了操作系統(tǒng)的透明性。 
  
    4、結(jié)論 
  
    嵌入式系統(tǒng)由于它的專用性和特殊性,系統(tǒng)的軟硬件設(shè)計都與傳統(tǒng)的計算機系統(tǒng)設(shè)計方法有所不同。但進行嵌入式系統(tǒng)設(shè)計時仍然很有必要借鑒傳統(tǒng)計算機系統(tǒng)體系結(jié)構(gòu)成熟的設(shè)計方法,“量體裁衣”為我所用。作者在進行嵌入式平臺設(shè)計時借鑒了傳統(tǒng)計算機虛擬存儲思想來擴展存儲系統(tǒng),并在實際項目中得以應(yīng)用,證明這種方法是非常有效的。

分享到

多易