隨著(zhù)8051微控制器性能的不斷提高,使用多任務(wù)操作系統對單片機進(jìn)行資源管理已成為當代開(kāi)發(fā)的需要。由于受靜態(tài)鏈接的限制,8051系統的多任務(wù)開(kāi)發(fā)需要處理代碼重入(reentrance)的問(wèn)題。 為了實(shí)現重入,通?梢岳Keil C51的關(guān)鍵字reentrant,將函數聲明為重人類(lèi)型。通過(guò)在重入堆棧分配局部變量,使函數具有可重入性;但該重入方案的實(shí)時(shí)性較差。 為提高多任務(wù)系統的實(shí)時(shí)性,本文介紹一種新方案——基于頁(yè)的多任務(wù)模型。 1 重入函數的原理與不足 當使用Kcil C51的關(guān)鍵字reentrant來(lái)指定函數屆性時(shí),即得重入函數(reentrant function)。 1.1 重入函數的原理 重入函數的原理是Keil C編譯器建立一個(gè)軟件操作的重入堆棧。重入函數能自動(dòng)為不同的調用者在重入堆棧中分配獨立局部變量,使函數具備重入性。 變量分配過(guò)程如圖l所示,函數人口首先申請存儲空間。函數返回前,必須將所申請的存儲空間歸還。變量分配和回收的位置都是重入堆棧的棧頂。 1.2 重入函數的不足 重入堆棧的最大缺點(diǎn)為效率低,Keil C51用戶(hù)手冊中已有明確記載。 由圖l可作以下分析:首先,每次使用局部變量都需要計算變量地址,大大降低了變量存取速度,也消耗了處理器時(shí)間;其次,因為重入堆棧是純軟件實(shí)現的,因此反復進(jìn)行的堆棧操作使重入函數的實(shí)時(shí)性進(jìn)一步惡化。 2 基于頁(yè)的多任務(wù)模型原理與實(shí)現 2.1 原理 解決函數重入的關(guān)鍵在于局部變量的分配,可以從8051存儲器類(lèi)型的分析和選擇入手。 8051控制器能直接尋址的存儲器類(lèi)型很豐富。在這些類(lèi)型中,我們注意到了頁(yè)變量(pdata)及其與眾不同的特性。 (1)頁(yè)變量pdata 根據Intel公司的用戶(hù)手冊,805l的頁(yè)存儲器就是指單字節地址方式操作的外部存儲器。使用單字節地址方式時(shí),允許使用P2對外部數據來(lái)分頁(yè),該方式的操作指令為“MOVX@Ri”。指令中R0或R1提供頁(yè)內地址(低8位地址),P2寄存器隱藏地提供頁(yè)地址(高8位地址)。 單字節地址方式將8051的64 KB外部存儲器分成256個(gè)頁(yè)面,如圖2所示。其硬件特征如下:①系統的256個(gè)頁(yè)面的存儲結構完全一致;②工作頁(yè)面可以被指定為這256頁(yè)中的任意一頁(yè);③頁(yè)地址由P2隱式提供給地址總線(xiàn),且頁(yè)地址可以由程序修改。 工具方面,Keil C51專(zhuān)用關(guān)鍵字pdata表示單字節方式尋址的外部數據類(lèi)型,pdata變量即頁(yè)變量。編譯后的頁(yè)變量具有以下特性:①頁(yè)變量操作嚴格對應單字節地址方式;②頁(yè)變量全部轉換成了靜態(tài)頁(yè)內地址。 (2)頁(yè)函數 根據頁(yè)變量性質(zhì),只要函數的所有局部變量都被指定為頁(yè)變量類(lèi)型,那么,函數所生成的代碼就可以工作于系統任一頁(yè)面上。 當操作系統為一個(gè)函數分配多個(gè)頁(yè)面時(shí),該函數與每一個(gè)頁(yè)面上的局部變量均構成一個(gè)進(jìn)程。 與重入函數不同,這類(lèi)函數本身不能自動(dòng)分配變量,因此沒(méi)有重入性。只有在操作系統的協(xié)助下,為其分配工作頁(yè)后,頁(yè)函數才是可重入的。頁(yè)函數中變量使用靜態(tài)地址,因此其存取速度得到大幅提升,改善了系統的實(shí)時(shí)性。 為區別Keil C51定義的重入函數(reentrant func-tion),我們稱(chēng)這種只使用頁(yè)變量的函數為“基于頁(yè)的重入函數(page-based reentrant function)”,簡(jiǎn)稱(chēng)為“頁(yè)函數”。 2.2 實(shí)現 根據原理分析中的可行性,筆者設計了名為Celia的基于頁(yè)的占先式8051多任務(wù)調度內核。沿用μC/OS-II的結構框圖與處理流程,在TCB(Task Control Block,任務(wù)控制塊)中增加一個(gè)字節的頁(yè)面字段,并改寫(xiě)了部分程序。有μC/OS-II為參照,使該調度內核的設計可以很快完成。經(jīng)過(guò)在以W78P438為核心的平臺上實(shí)測,該系統調度正常,程序運行正確。這證明該重入方案可行。 3 基于頁(yè)的多任務(wù)模型性能分析 基于頁(yè)的多任務(wù)模型的程序結構與μC/OS-II基本一致,其區別主要是頁(yè)函數與重入函數的區別,因此,這里主要分析頁(yè)變量存取與重入堆棧變量存取的性能對比。 3.1 優(yōu)點(diǎn) (1)更高的變量存取帶寬 8051為8位總線(xiàn)接口,單字節存取是其基本操作。研究單字節變量的存取帶寬可以從根本上說(shuō)明頁(yè)變量的優(yōu)點(diǎn)。 805l系統操作外部存儲器使用的是MOVX指令。執行該指令需要2個(gè)機器周期。在標準8051中,1個(gè)機器周期為12/fOSC,則總線(xiàn)帶寬如式(1)所示。其中fOSC為晶振頻率。 如圖l,重入函數操作單字節變量i=0xaa,共需要15個(gè)機器周期。其中僅計算變量地址就需要12個(gè)機器周期。因此,重入堆棧的實(shí)際存取帶寬如式(2)所示。 相對地,頁(yè)函數中變量地址是確定的。因為不需要計算地址的額外操作,其變量操作速度比重入堆棧有大幅提高。如圖3所示,頁(yè)函數中操作單字節變量只需要4個(gè)機器周期。頁(yè)變最的實(shí)際存取帶寬如式(3): 各種帶寬的對比如下: 進(jìn)一步分析可知,操作多字節變量時(shí),重入函數也只需要計算一次變量地址。故進(jìn)行單字節變量存取時(shí),重入堆棧的存取帶寬就是最低值。 綜上所述,相對重入堆棧,存取單字節變量過(guò)程中,頁(yè)函數的帶寬加速比達到最大值Rmax=3.75,如式(4)所示。這表示相對于過(guò)去的重入函數,頁(yè)函數具有更高的執行效率和實(shí)時(shí)性。 另外,如果頁(yè)函數不需要計算和操作重入堆棧指針,則不需要圖1中函數入口和出口處的指針操作(C?ADDXBP),可再次節省22個(gè)(首尾各11)指令周期。 (2)較好的安全性 配置頁(yè)面的工作是由操作系統完成的。在使用基于頁(yè)的多任務(wù)開(kāi)發(fā)中,任務(wù)本身不能更換頁(yè)面;因此,私有變量的操作只在當前頁(yè)進(jìn)行,不會(huì )影響到其他頁(yè)或其他任務(wù)。這樣的程序封裝體現了較好的安全性。 3.2 存在問(wèn)題與解決方法 (1)容量的限制 8051的硬件決定了頁(yè)面大小為256字節,不可變更。這使得“頁(yè)面容量限制”成為基于頁(yè)的多任務(wù)開(kāi)發(fā)中最需要考慮的問(wèn)題。 存儲器的一頁(yè)為256字節,與最小模式下8051的內部數據空間(IDATA空間)大小相同。因此,筆者認為頁(yè)變量的256字節能滿(mǎn)足最小模式任務(wù)的需要。 對于需求超過(guò)256字節的任務(wù),可在頁(yè)面外的外部存儲器中申請后備空間。只要指向后備空間的指針在頁(yè)面內,則該后備空間仍是私有的,滿(mǎn)足重入條件,其結構示意圖如圖4所示。雖然后備存取區使用指針操作,但不需要計算變量地址,因此后備存儲區存取速度優(yōu)于重入堆棧。 (2)工具的限制 目前,Keil C51開(kāi)發(fā)工具不提供多任務(wù)以及多頁(yè)面支持。這主要體現在兩點(diǎn): ①需要新的函數庫,F有的大量函數庫不支持頁(yè)函數方式重入。準確地說(shuō),大部分函數庫不支持任何方式的重入——即使使用重入堆棧,函數庫問(wèn)題也依然存在。目前的解決方法只有程序員根據需要編寫(xiě)新的頁(yè)函數庫。 ②一個(gè)項目中只允許存在一個(gè)pdata頁(yè)面,不能按任務(wù)將變量安排在不同的邏輯頁(yè)面上。其后果是,多任務(wù)開(kāi)發(fā)中,編譯鏈接工具只在同一個(gè)頁(yè)面中分配所有任務(wù)的頁(yè)變量,導致存儲器迅速溢出。 問(wèn)題②的解決方案是:為使每個(gè)任務(wù)具有自己的工作頁(yè),為每個(gè)任務(wù)單獨建立工程,并使用COMPACT方式進(jìn)行編譯。各個(gè)任務(wù)工程之間和操作系統之間使用絕對地址表傳遞系統調用和任務(wù)入口地址。絕對地址表是對一些系統調用的約定地址。 這些不便之處是暫時(shí)的、可克服的。 結語(yǔ) 8051主要應用領(lǐng)域為實(shí)時(shí)控制,因此努力提高系統實(shí)時(shí)性是開(kāi)發(fā)者不斷追求的目標。筆者從提高實(shí)時(shí)性的角度出發(fā),提出了一種基于頁(yè)的多任務(wù)模型。相對于目前重入堆棧多任務(wù)模型,它具有較好的實(shí)時(shí)性,也是處理重入問(wèn)題的一種新思路。 本模型已經(jīng)過(guò)Keil C5l仿真工具的一般性測試,并在W78P438芯片上實(shí)測成功,相信其結果適用于全部8051及兼容系列?紤]到8051依然廣泛應用在多任務(wù)開(kāi)發(fā)中,本文中的新模型值得推廣。 |