適應實時多任務的微控制器高效指令支持
微控制器系統(tǒng)即國內(nèi)通常所稱的單片機系統(tǒng),主要用于物理設備的接口和直接控制。雖然控制邏輯相對微處理機系統(tǒng)而言比較簡單,但由于多數(shù)情況下需要實時響應,而且經(jīng)常要同時處理多個對象的協(xié)同工作,因此,不僅對程序的運行效率有較高的要求,還要求微控制器具備較強的多任務處理能力。另一方面,由于量大面廣,以及具體應用條件的限制,希望微控制器的成本要低;而這又只有在微控制器的硬件結構相對簡單的前提下才能實現(xiàn),這就限制了微控制器的指令、程序代碼空間以及數(shù)據(jù)存儲容量。在這樣的局面中,想要實現(xiàn)較高的運行效率,就只有加強微控制器指令的功能和靈活性。
至今,絕大多數(shù)微控制器程序的編制仍使用匯編語言,其優(yōu)缺點已眾所周知。隨著硬件技術的發(fā)展,器件的性能價格比顯著提高,各種面向嵌入式應用的微控制器系統(tǒng)模塊向商品化發(fā)展。微控制器系統(tǒng)的成本中,軟件比例不斷增加,使用高級語言編制微控制器應用系統(tǒng)的軟件是必然的趨勢;而且微控制器中能進行算術運行和邏輯運算的運算器結構、可以直接與數(shù)據(jù)總線交換數(shù)據(jù)并進行關系運算的單元個數(shù)、間址訪問的能力等因素,將直接影響高級語言生成機器代碼的難易程度。為完成某一運算,不能只計算運算本身所需的時間,還要考慮建立本處理環(huán)境所需的時間、取運算對象與保存運算結果的輔助操作時間、以及所占用的指令空間。簡言之,要考慮所有影響6代碼效率和運行效率的因素。
轉移控制指令是直接影響程序運行的,但其前提是狀態(tài)檢測或者關系運算的結果;而狀態(tài)檢測需要位尋址能力的支持,關系運算又必須訪問兩個對象,所以,位尋址能力、數(shù)據(jù)訪問能力、數(shù)據(jù)訪問方式都與程序的運行效率有關。根據(jù)作者多年編制實時應用程序的體會,針對實時多任務應用,就高效率的微控制器數(shù)據(jù)訪問能力、方式與轉移控制指令設計而言,應具備以下四方面性能。
1.指令的關系運算能力
關系運算是控制程序轉移的前提,其運算能力由兩個方面組成:一是運算功能;二是運算單元數(shù)目。
在8位機系統(tǒng)中,運算功能一般都支持無符號的大于、小于、等于、不等于比較;在16位機系統(tǒng)中,還應支持有符號的比較,并且要求有多個運算單元都支持關系運算。如果常用的一些功能單元個數(shù)較少,則當進程切換時,要花費時間置換資源。假如微控制器中只有一個寄存器能進行關系運算,必須經(jīng)常進行中間結果的換位存取。這些額外操作的代價是指令數(shù)目與運行時間的增加,那將極大地影響程序運行效率。例如,要根據(jù)兩個關系運算的結果決定處理策略,首先,要將第一次關系運算的邏輯結果保存起來,可能還需要保留運算后的數(shù)據(jù)結果,再裝入第二次需要的運算對象。其最小代價是多中用一條指令的存儲空間和一次裝入所需的運算時間,而且沒有任何的額外收益。此外,多任務運行時將頻繁產(chǎn)生中斷,在中斷服務程序中,必須騰出運算器,又要多占用一個堆棧空間來保存斷中數(shù)據(jù),以及一次進棧、一次出棧的兩條指令的存儲空間和運行時間。這些都是在微控制器應用系統(tǒng)中的寶貴資源,因此,這樣的微控制器是不適應實時多任務系統(tǒng)應用的?,F(xiàn)在,許多微控制器都采用寄存器組的結構,每一個寄存器都可支持關系運算和簡單的算術運算功能,便于實現(xiàn)高級語言中“局部變量”的特性。其主要優(yōu)點是存儲器的利用率高,數(shù)據(jù)完全性好。這就大大緩解了運算能力的瓶頸。
2.指令的數(shù)據(jù)訪問能力
(1)運算對象的訪問方式
指令對運算對象的訪問方式非常重要。如果同類資源只能使用特定名稱區(qū)分訪問。則處理多進程時,功能相似的程序段必須書寫不同的代碼段。代碼重用性差,這就增加了總代碼長度。所以,間址訪問非常重要,它可以用同樣的程序處理不同的對象,在多任務處理環(huán)境中能顯著提高系統(tǒng)效益。
位信息是二進制中最基本的數(shù)據(jù)??刂葡到y(tǒng)中,經(jīng)常需要檢測位信息,例如進程的標識、外設的狀態(tài)等。在多任務系統(tǒng)中,各進程將占用不同物理地址的系統(tǒng)資源。這時,指令能否支持間址的位訪問,就大大影響進程之間的切換。如果不支持間址的位訪問,假設有8位信息點,則必須編寫8句直接位檢測的語句來判別,增加了代碼的長度;如果各進程要使用同一個代碼段,必須為各進程置換重用的資源,浪費時間;而如果各進程使用不同的資源,則必須書寫代碼功能相同、僅僅資源不同的代碼?,F(xiàn)在常用的微控制器,位間接尋址能力都比較差,編寫程序費時費力,代碼冗長,修改困難。
對于字節(jié)數(shù)據(jù),要求提供既可對數(shù)據(jù)代碼區(qū),又可對程序代碼區(qū)的間址訪問支持。當前常見的微控制器,雖然也提供對程序代碼區(qū)的間址訪問支持,但限于查表操作。應用程序要訪問存放于數(shù)據(jù)內(nèi)的常數(shù),必須先調(diào)用查表程序獲取對象,再將它放入某個工作單元,然后才能開始處理。如果能通過間址直接訪問程序存儲器中的數(shù)據(jù)表,則節(jié)省了時間與空間的開銷。
(2)數(shù)據(jù)描述能力
隨著人工智能、自適應、自學習技術的發(fā)展,參與關系運算的兩個對象經(jīng)常都是變量,微控制器指令系統(tǒng)的設計必須考慮這一因素。
關系運算的兩個對象,應該支持運算器與立即數(shù)、寄存器、直接尋址或者間接尋址對象的關系運算;而間接尋址對象可以放在數(shù)據(jù)存儲區(qū)中,也可以在程序存儲區(qū)中??紤]到數(shù)組、隊列的運算需要,比較理想的是間址寄存器支持指定次數(shù)循環(huán)或者支持循環(huán)隊列操作。
相對尋址能力;采用一個基指針,再與間址寄存器疊加形成訪問地址。既可訪問程序代碼空間。便于查表操作,用空間資源換取時間,提高非線性運算的處理速度;又可訪問數(shù)據(jù)存儲空間,便于計算機輔助開發(fā)應用程序生成運行代碼中數(shù)據(jù)間址訪問。
3.原子操作指令支持
同步與互斥是多進程必須處理的問題。多進程搶占系統(tǒng)資源時,要先判斷系統(tǒng)資源使用標識。一般用一個位標識,是空閑則占用。這是一種互斥行為,一旦資源被占用,其它進程不得使用。為了避免一個進程檢測到系統(tǒng)資源空閑之后,但在未改變標識位之間,另一個進程也檢測到該資源空閑,必須將檢測與改變標識設計為原子操作。一般,都通過禁止系統(tǒng)中斷來解決。在檢測之前關閉中斷,檢測之后再開啟中斷。如果指令提供對標志位以及對標識字節(jié)的原子操作支持,將減少程序并提高效率。
(1)標識位操作指令
要求對標識位的檢測、清除標識位以及轉移,在一條指令內(nèi)完成。這在有些微控制器中已有指令支持。
(2)適應信號燈操作的指令
多進程并發(fā)運行時,經(jīng)常用到信號燈技術。為了適應PV操作等同步與互斥操作,微控制器應提供減一等于某值轉移,以及增一等于某值轉移這樣的指令支持。這樣就可免去信號監(jiān)測前后的關閉、開啟中斷操作,而僅在需要保護臨界區(qū)時才關閉中斷。禁止中斷的時間減少了,相當于系統(tǒng)響應實時事件的能力增強。除了支持與常數(shù)的比較之外,指令還應支持與某寄存器或者間址存儲單元的比較,這樣就相當靈活。當該指令中的比較值取為0時,就是常用于控制循環(huán)的指令。
4.支持多進程切換的指令能力
當系統(tǒng)資源不能滿足運行需要時,就要將進程掛起,同時也需要保留斷點信息。從原理上講,凡是進程自用的各種信息,都必須保留,進程下次由就緒態(tài)轉為運行時,要以它們?yōu)橐罁?jù),經(jīng)過多次判斷后才能恢復斷點信息??梢姡瑨炱疬^程和恢復過程要無謂地占用CPU時間。為解決這一矛盾,應設計如下指令功能。
(1)帶回下次入口地址的調(diào)用返回指令
程序運行到某點,即隱含了條件的滿足。進程掛起點的空間位置,隱含著進程運行的軌跡,即包含了掛起的原因。進程再次獲得CPU資源,只要回到該點,再配以新狀態(tài)條件,即可迅速恢復運行,而不需要重新再判別歷史條件。因此,微處理器應該支持以指針間址存儲單元內(nèi)容(數(shù)據(jù))為轉移地址的調(diào)用指令,采用類似推棧指針重置PC指令的方法,用間址訪問獲取調(diào)用的入口地址。調(diào)用返回時,帶回下次的入口地址,仍用該間址指針更新轉移地址。
下次的入口地址,實際上并不需要放在哪個寄存器中帶回,只要執(zhí)行調(diào)用返回指令時,將當前程序計數(shù)器中的PC值(它已經(jīng)含有下條指令首地址)送以用間址指針指向的存儲單元即可,這種方法可以在8位機系統(tǒng)中方便地實現(xiàn)。它與常規(guī)的調(diào)用返回恢復調(diào)用點地址的做法不同之處在于先做了一步保存PC值的工作。調(diào)用返回指令有兩種:其一是保存當前PC值并返回,下次調(diào)用直接轉向指定入口;另一種則不保存當前PC值而返回,下次調(diào)用仍舊進入原入口。
為支持這種調(diào)用返回機制,在它之前的語句通常是一條判斷轉移指令,當不滿足進程繼續(xù)運行條件就執(zhí)行調(diào)用返回。為提高指令效率,判斷轉移指令必須是雙向的:有進程轉移和無進位轉移;零狀態(tài)轉移和非零狀態(tài)轉移;相等轉移和不相等轉移;大于轉移和小于轉移。對于位操作中的判斷并清除標識位再轉移的原子操作指令,則最好再提供判斷并置位標識位再轉移指令,以方便使用。
(2)支持可變中斷矢量
實時系統(tǒng)普遍采用中斷技術,許多微控制器采用固定中斷矢量的實現(xiàn)方法。不同情況下的中斷也只能執(zhí)行相的指令段,而必須要在中斷服務程序中辨別當前狀況,一般,編程者都采用增設狀態(tài)變量的方法,供下次中斷服務時指引處理路徑。本次中斷結束之間的這部分準備工作以及下次進入中斷時的尋找路徑,都是無謂消耗CPU資源與時間;而采用可變中斷矢量的實現(xiàn)方法,進入中斷服務之后直接到達任務處理點,可避免上述弊端,提高中斷服務響應速度。具體方法類似調(diào)用返回的處理,保存本次中斷處理服務程序的終止點地址作為新的中斷向量即可。
(3)組合條件對進程狀態(tài)轉移的控制
對于16位處理器,還可以提供以當前指令為基地址,以寄存器內(nèi)容作為偏移地址的直接跳轉或者調(diào)用支持。
進程需要處理多因素條件 綜合與抉擇,運行時要探測信息標識,依據(jù)多個狀態(tài)變量決定運行路徑。設有n個信息標識,由它可引導k(k≤2 n)條路徑。采用逐個辨識的方法。需n次;而如果將這n個信息標識作為矢量地址看待,與基地址共同形成物理地址,即可直接轉移。當k遠小于2n時,可采用分段的方法,將n個信息標識中的一部分用作矢量地址,以減少對程序存儲器的占用。
(4)便于多進程切換的指令能力
上述間址移機制,不但可以支持數(shù)據(jù)驅動的程序控制,也適宜于按時間片分配進程運行。當系統(tǒng)分配給該進程的時間用完,進入高優(yōu)先級的系統(tǒng)定時器中斷。此時,堆棧頂保存的是被中斷進程的斷點地址,只要將其作為該進程的下次入口地址保存起來,并執(zhí)行完該進程的斷點保護工作后,再遞增指針,指向下一進程的入口地址,即可在定時器中斷返回之后,自動將下進程投入運行。
(5)支持循環(huán)任務隊列的功能
并發(fā)運行的多任務,數(shù)目會發(fā)生變化。微控制器應提供支持循環(huán)任務隊列的指令,例如前面所說的指針增減一等于某值轉移指令,可實現(xiàn)任意位置與長度的循環(huán)隊列管理,便于正反雙向遍歷。對于多任務處理,各進程所需的循環(huán)隊列長度會不同。如果指令格式規(guī)定比較值必須是固定的常數(shù),則必須為不同的進程編寫惟有比較值不同而功能完全一樣的代碼段,顯然并合理。較好解決方法是間址寄存器支持訪問變量。
(6)二級指針管理寄存器塊
一些常用的內(nèi)部存儲單元可組成工作組的形式,用二級指針指明當前工作組。在多進程并發(fā)運行時,這種方式可加快數(shù)據(jù)切換等斷點保護和恢復工作,并減少指令。
上述指令,在有些微控制器的指令集,已有體現(xiàn),在此提出,供編制實時多任務應用程序設計者在選用微控制器時參考。有些指令尚未實現(xiàn),出來供微控制器設計者參考。
隨著微電子技術的發(fā)展,這些指令的功能并非難以實現(xiàn),只是要在功能與功能、功能與成本之間進行權衡,或許只能在某些高檔的微控制器中才能支持。隨著專用系統(tǒng)概念的增強,適用于實地多任務系統(tǒng)應用的微控制器,將使得應用系統(tǒng)設計者更靈活、更迅速地開發(fā)出低成本、高性能的產(chǎn)品。
評論