崔鵬飛 郭小波 王開(kāi)林 肖輝遠(yuǎn) 葛利軍
1.公安部第一研究所 2. 北京市微技術(shù)研究所
當(dāng)前,電子證件芯片操作系統(tǒng)(COS)幾乎全部采用應(yīng)答式單線程模式,該模式在主函數(shù)中構(gòu)建一個(gè)死循環(huán),當(dāng)芯片從天線獲取能量啟動(dòng)后,進(jìn)入該死循環(huán),在循環(huán)內(nèi)部構(gòu)建相應(yīng)的專用業(yè)務(wù)流程。
業(yè)務(wù)流程中一般會(huì)涉及加解密計(jì)算、對(duì)芯片EEPROM的讀寫(xiě)和無(wú)線接口的收發(fā)等工作,這些業(yè)務(wù)都是通過(guò)主程序的死循環(huán)進(jìn)行順序執(zhí)行,并完成一個(gè)交互。此種單進(jìn)程業(yè)務(wù)流程使單片機(jī)的運(yùn)行效率較低。
本系統(tǒng)在電子證件芯片中構(gòu)建多進(jìn)程,使芯片在獲取命令后把相互獨(dú)立的步驟進(jìn)行并發(fā)運(yùn)行。這種運(yùn)行模式會(huì)提高芯片的執(zhí)行效率和資源使用率,為電子證件芯片未來(lái)發(fā)展提供新模式,滿足電子證件未來(lái)發(fā)展需求。
時(shí)間片輪轉(zhuǎn)(Round-Robin)方法是讓先來(lái)先服務(wù)(FCFS)的進(jìn)程就緒隊(duì)列中的進(jìn)程都得到處理器一個(gè)時(shí)間片來(lái)運(yùn)行,在時(shí)間片使用完畢后,如果進(jìn)程任務(wù)執(zhí)行完畢,則進(jìn)程結(jié)束;否則系統(tǒng)把該進(jìn)程移動(dòng)至就緒隊(duì)列的隊(duì)尾,依此循環(huán),直到所有進(jìn)程都執(zhí)行完畢。有一種特殊情況是:當(dāng)一個(gè)進(jìn)程在合法時(shí)間片運(yùn)行過(guò)程中發(fā)生I/O請(qǐng)求,系統(tǒng)會(huì)把該進(jìn)程放入系統(tǒng)阻塞隊(duì)列,當(dāng)I/O請(qǐng)求工作完成后,系統(tǒng)自動(dòng)把該進(jìn)程放入進(jìn)程就緒隊(duì)列中。圖2簡(jiǎn)單示意Round-Robin對(duì)一個(gè)進(jìn)程的調(diào)度運(yùn)行過(guò)程。
以上過(guò)程圖要正常運(yùn)行,則需要對(duì)時(shí)間片進(jìn)行控制,這就需要芯片有定時(shí)器來(lái)控制時(shí)間片的大??;時(shí)間片運(yùn)行完畢需要對(duì)進(jìn)程進(jìn)行調(diào)度,則需要芯片有中斷機(jī)制,中斷服務(wù)程序完成對(duì)進(jìn)程的調(diào)度。
這里的中斷是指異?;蛘呤录囊环N響應(yīng),該響應(yīng)會(huì)自動(dòng)保存系統(tǒng)當(dāng)前狀態(tài)以便恢復(fù)并自動(dòng)進(jìn)入中斷服務(wù)程序。
具體到本系統(tǒng),定時(shí)器到達(dá)預(yù)定時(shí)間發(fā)出中斷請(qǐng)求給中斷控制器,中斷控制器把該請(qǐng)求通過(guò)仲裁之后發(fā)送給CPU,請(qǐng)求運(yùn)行時(shí)鐘中斷服務(wù)程序。圖3示意中斷機(jī)制過(guò)程。
在計(jì)算機(jī)控制中定時(shí)器是一個(gè)常用的模塊,一般可以通過(guò)軟件、不可編程硬件或可編程硬件實(shí)現(xiàn)。
STC89C52RC單片機(jī)定時(shí)器屬于可編程定時(shí)器,達(dá)到預(yù)定時(shí)間后以中斷方式請(qǐng)求CPU響應(yīng),定時(shí)準(zhǔn)確,不浪費(fèi)CPU時(shí)間。
51系列單片機(jī)定時(shí)器結(jié)構(gòu)圖如圖4所示:
在STC89C52RC增強(qiáng)型單片機(jī)中,本例選用定時(shí)器2,通過(guò)寄存器T2CON、T2MOD、RCAP2H和RCAP2L,并通過(guò)ET2位和TR2位配合控制運(yùn)行。
本系統(tǒng)通過(guò)STC89C52RC單片機(jī)模擬運(yùn)行,采用時(shí)間片輪轉(zhuǎn)法,并使用UART口為輸出口顯示系統(tǒng)運(yùn)行信息,即UART口模擬進(jìn)程共享設(shè)備(即:臨界資源)。因此,進(jìn)程在并發(fā)運(yùn)行時(shí),首先需要通過(guò)互斥關(guān)系去獲得資源,然后輸出自己的信息,最后再釋放資源給其他進(jìn)程使用。該過(guò)程需要使用信號(hào)量和P、V操作實(shí)現(xiàn)進(jìn)程間互斥。
臨界區(qū)是指各個(gè)進(jìn)程在對(duì)臨界資源進(jìn)行操作的程序段。利用P、V操作解決臨界區(qū)問(wèn)題時(shí),首先設(shè)置S為進(jìn)程互斥的公用信號(hào)量并賦予初值,然后把臨界區(qū)程序段放置于P(S)操作和V(S)操作之間即可,圖5以兩個(gè)進(jìn)程為例示意:
本系統(tǒng)中S信號(hào)量是全局變量 volatile unsigned char Cr_Count,這里volatile關(guān)鍵字不能缺,確保系統(tǒng)在獲取該參數(shù)時(shí)都需要重新讀取,從而獲得實(shí)時(shí)值。
·進(jìn)入臨界區(qū)函數(shù)結(jié)合STC89C52RC單片機(jī)設(shè)計(jì)如下:
這里首先需要關(guān)閉STC89C52RC單片機(jī)系統(tǒng)中斷,在進(jìn)程進(jìn)入臨界區(qū)后系統(tǒng)不能響應(yīng)任何中斷,不然會(huì)導(dǎo)致臨界區(qū)代碼執(zhí)行異常,或者可以認(rèn)為臨界區(qū)必須是原子操作。
·離開(kāi)臨界區(qū)函數(shù)結(jié)合STC89C52RC單片機(jī)設(shè)計(jì)如下:
這里首先判斷Cr_Count大于1,這表明有多少個(gè)進(jìn)程需要進(jìn)臨界區(qū),也可以讓系統(tǒng)判斷是否要真的退出臨界區(qū),如果Cr_Count等于0,這時(shí)表示沒(méi)有進(jìn)程需要再進(jìn)入臨界區(qū),這時(shí)打開(kāi)系統(tǒng)中斷,系統(tǒng)恢復(fù)響應(yīng)中斷。
共享設(shè)備即臨界資源,對(duì)臨界資源的訪問(wèn),我們使用一種稱為“鎖”的機(jī)制。這種方法是用一個(gè)全局變量Z,把變量Z稱為“鎖”。它有兩種狀態(tài):0和X(非0正數(shù)),0表示鎖打開(kāi)、X表示鎖關(guān)閉。還有一個(gè)加鎖操作LOCK(Z)和一個(gè)解鎖操作UNLOCK(Z),LOCK就是將Z置為X,UNLOCK是將Z置為0。
本系統(tǒng)Z變量對(duì)應(yīng)于全局變量unsigned char uart_used,并在UART初始化時(shí)賦值為0,表示設(shè)備沒(méi)有被占用。
·基于鎖機(jī)制的獲取設(shè)備函數(shù)偽代碼如下設(shè)計(jì):
在獲取UART時(shí)使用了Enter_Critical()和Exit_Critical()函數(shù),主要是因?yàn)閡art_used變量的賦值操作也必須是原子操作。不難看出上面流程主要功能是將uart_used變量置為X的過(guò)程。
·基于鎖機(jī)制的釋放設(shè)備函數(shù)偽代碼如下設(shè)計(jì):
這里主要功能就是將uart_used變量值置為0,表示臨界資源處于可使用狀態(tài)。
本系統(tǒng)主要用到了STC89C52RC單片機(jī)的定時(shí)器中斷,在中斷服務(wù)程序中編寫(xiě)了進(jìn)程調(diào)度代碼,該段代碼有以下要求:
·必須關(guān)閉系統(tǒng)中斷,進(jìn)程在調(diào)度時(shí)不能被中斷,否則進(jìn)程就會(huì)運(yùn)行錯(cuò)亂;進(jìn)程結(jié)束后再打開(kāi)系統(tǒng)中斷。
·必須在進(jìn)入中斷時(shí)保護(hù)CPU上下文,離開(kāi)中斷時(shí)恢復(fù)CPU上下文。
·必須清除定時(shí)器中斷,離開(kāi)中斷時(shí)不需要設(shè)置它,因?yàn)橛布?huì)自動(dòng)設(shè)置。
·對(duì)以上三種操作,在進(jìn)入中斷服務(wù)程序時(shí),最好先關(guān)閉系統(tǒng)中斷,然后保護(hù)CPU上下文,最后清定時(shí)器中斷標(biāo)志;離開(kāi)中斷服務(wù)程序時(shí),先恢復(fù)CPU上下文,最后打開(kāi)系統(tǒng)中斷。
基于STC89C52RC單片機(jī)的定時(shí)器中斷服務(wù)程序偽代碼如下:
保護(hù)CPU上下文沒(méi)有出現(xiàn)ACC、PSW、B寄存器,這是因?yàn)镾TC89C52RC單片機(jī)會(huì)自動(dòng)對(duì)它們進(jìn)行壓棧保護(hù);保護(hù)CPU上下文出現(xiàn)的PUSH X對(duì)應(yīng)恢復(fù)CPU上下文出現(xiàn)的POP X匯編指令,表示對(duì)X號(hào)寄存器進(jìn)行壓棧和出棧。
8051系列單片機(jī)在片內(nèi)RAM中有4個(gè)不同的工作寄存器組,每個(gè)寄存器組包含8個(gè)工作寄存器R0-R7。
本節(jié)主要是在第4節(jié)功能的基礎(chǔ)上完成對(duì)進(jìn)程的運(yùn)行操作,這樣就達(dá)到了該系統(tǒng)最終設(shè)計(jì)目標(biāo)。進(jìn)程的運(yùn)行操作主要有三種:進(jìn)程創(chuàng)建、進(jìn)程調(diào)度和進(jìn)程刪除。
進(jìn)程在系統(tǒng)中是分配資源的單位,本系統(tǒng)通過(guò)二維數(shù)組unsigned char idata Task_Stack[MAX_TASK][S_DEPTH]給每個(gè)進(jìn)程分配相應(yīng)資源。從這里可看出,系統(tǒng)可以最多創(chuàng)建MAX_TASK個(gè)進(jìn)程,每個(gè)進(jìn)程最多占用S_DEPTH片內(nèi)RAM資源,這里關(guān)鍵字idata也可以換成xdata,但是建議用片內(nèi)資源。進(jìn)程創(chuàng)建函數(shù)偽代碼如下:
參數(shù)Task_P、Task和Msg分別表示進(jìn)程優(yōu)先級(jí)、進(jìn)程入口程序和進(jìn)程消息。
進(jìn)程調(diào)度主要完成進(jìn)程使用完預(yù)定時(shí)間片后對(duì)另外一個(gè)進(jìn)程進(jìn)行調(diào)度運(yùn)行的功能,該代碼段編寫(xiě)在定時(shí)器中斷服務(wù)程序中。其偽代碼如下:任務(wù)
進(jìn)程刪除即把一個(gè)不再有價(jià)值的進(jìn)程刪除,空出資源供其它進(jìn)程利用。進(jìn)程刪除主要是在任務(wù)列表上清除任務(wù)標(biāo)志,并清除進(jìn)程控制塊和其占用的資源。其偽代碼如下:
當(dāng)前系統(tǒng)通過(guò)STC89C52RC單片機(jī)模擬運(yùn)行,運(yùn)行操作流程如下:
1. 在系統(tǒng)主函數(shù)中創(chuàng)建相應(yīng)的任務(wù),代碼截圖如圖6。
2. 編譯工程。
3. 正確連接STC89C52RC單片機(jī)開(kāi)發(fā)板,下載hex文件需要STC-ISP專用軟件,圖7所示已經(jīng)完成下載hex文件。
4. 啟動(dòng)STC89C52RC單片機(jī),通過(guò)串口調(diào)試助手工具捕獲四個(gè)進(jìn)程發(fā)出的信息,如圖8所示。
隨著公安業(yè)務(wù)的不斷前進(jìn)與發(fā)展,對(duì)便攜式設(shè)備和安全證卡類有限資源的裝備材料需求越來(lái)越多,作者通過(guò)一個(gè)小資源單片機(jī)實(shí)現(xiàn)了一個(gè)小的并發(fā)系統(tǒng),可以應(yīng)用于便攜式設(shè)備和證卡等小芯片資源中,該系統(tǒng)是一個(gè)可以完成需要并發(fā)執(zhí)行的多應(yīng)用任務(wù)平臺(tái)。
該系統(tǒng)目前還有其局限性,但經(jīng)過(guò)測(cè)試,在滿足目前公安的一些應(yīng)用上是可行的。以后可以替換目前在應(yīng)用的單線程應(yīng)用模式,擴(kuò)展了后期應(yīng)用思路。
[1] William Stallings著.陳向群譯. 操作系統(tǒng)精髓與設(shè)計(jì)原理.電子工業(yè)出版社,2010.
[2] 徐愛(ài)鈞,彭秀華.著. Keil Cx51 單片機(jī)高級(jí)語(yǔ)言編程與uVision2. 電子工業(yè)出版社,2008.
[3] 楊學(xué)昭,王東云,著.單片機(jī)原理、接口及應(yīng)用(含51).西安電子科技大學(xué)出版社,2009.