崔鵬飛 郭小波 王開林 肖輝遠 葛利軍
1.公安部第一研究所 2. 北京市微技術研究所
當前,電子證件芯片操作系統(COS)幾乎全部采用應答式單線程模式,該模式在主函數中構建一個死循環,當芯片從天線獲取能量啟動后,進入該死循環,在循環內部構建相應的專用業務流程。
業務流程中一般會涉及加解密計算、對芯片EEPROM的讀寫和無線接口的收發等工作,這些業務都是通過主程序的死循環進行順序執行,并完成一個交互。此種單進程業務流程使單片機的運行效率較低。

本系統在電子證件芯片中構建多進程,使芯片在獲取命令后把相互獨立的步驟進行并發運行。這種運行模式會提高芯片的執行效率和資源使用率,為電子證件芯片未來發展提供新模式,滿足電子證件未來發展需求。
時間片輪轉(Round-Robin)方法是讓先來先服務(FCFS)的進程就緒隊列中的進程都得到處理器一個時間片來運行,在時間片使用完畢后,如果進程任務執行完畢,則進程結束;否則系統把該進程移動至就緒隊列的隊尾,依此循環,直到所有進程都執行完畢。有一種特殊情況是:當一個進程在合法時間片運行過程中發生I/O請求,系統會把該進程放入系統阻塞隊列,當I/O請求工作完成后,系統自動把該進程放入進程就緒隊列中。圖2簡單示意Round-Robin對一個進程的調度運行過程。

以上過程圖要正常運行,則需要對時間片進行控制,這就需要芯片有定時器來控制時間片的大小;時間片運行完畢需要對進程進行調度,則需要芯片有中斷機制,中斷服務程序完成對進程的調度。
這里的中斷是指異常或者事件的一種響應,該響應會自動保存系統當前狀態以便恢復并自動進入中斷服務程序。
具體到本系統,定時器到達預定時間發出中斷請求給中斷控制器,中斷控制器把該請求通過仲裁之后發送給CPU,請求運行時鐘中斷服務程序。圖3示意中斷機制過程。

在計算機控制中定時器是一個常用的模塊,一般可以通過軟件、不可編程硬件或可編程硬件實現。
STC89C52RC單片機定時器屬于可編程定時器,達到預定時間后以中斷方式請求CPU響應,定時準確,不浪費CPU時間。
51系列單片機定時器結構圖如圖4所示:

在STC89C52RC增強型單片機中,本例選用定時器2,通過寄存器T2CON、T2MOD、RCAP2H和RCAP2L,并通過ET2位和TR2位配合控制運行。
本系統通過STC89C52RC單片機模擬運行,采用時間片輪轉法,并使用UART口為輸出口顯示系統運行信息,即UART口模擬進程共享設備(即:臨界資源)。因此,進程在并發運行時,首先需要通過互斥關系去獲得資源,然后輸出自己的信息,最后再釋放資源給其他進程使用。該過程需要使用信號量和P、V操作實現進程間互斥。
臨界區是指各個進程在對臨界資源進行操作的程序段。利用P、V操作解決臨界區問題時,首先設置S為進程互斥的公用信號量并賦予初值,然后把臨界區程序段放置于P(S)操作和V(S)操作之間即可,圖5以兩個進程為例示意:

本系統中S信號量是全局變量 volatile unsigned char Cr_Count,這里volatile關鍵字不能缺,確保系統在獲取該參數時都需要重新讀取,從而獲得實時值。
·進入臨界區函數結合STC89C52RC單片機設計如下:


這里首先需要關閉STC89C52RC單片機系統中斷,在進程進入臨界區后系統不能響應任何中斷,不然會導致臨界區代碼執行異常,或者可以認為臨界區必須是原子操作。
·離開臨界區函數結合STC89C52RC單片機設計如下:

這里首先判斷Cr_Count大于1,這表明有多少個進程需要進臨界區,也可以讓系統判斷是否要真的退出臨界區,如果Cr_Count等于0,這時表示沒有進程需要再進入臨界區,這時打開系統中斷,系統恢復響應中斷。
共享設備即臨界資源,對臨界資源的訪問,我們使用一種稱為“鎖”的機制。這種方法是用一個全局變量Z,把變量Z稱為“鎖”。它有兩種狀態:0和X(非0正數),0表示鎖打開、X表示鎖關閉。還有一個加鎖操作LOCK(Z)和一個解鎖操作UNLOCK(Z),LOCK就是將Z置為X,UNLOCK是將Z置為0。
本系統Z變量對應于全局變量unsigned char uart_used,并在UART初始化時賦值為0,表示設備沒有被占用。
·基于鎖機制的獲取設備函數偽代碼如下設計:

在獲取UART時使用了Enter_Critical()和Exit_Critical()函數,主要是因為uart_used變量的賦值操作也必須是原子操作。不難看出上面流程主要功能是將uart_used變量置為X的過程。
·基于鎖機制的釋放設備函數偽代碼如下設計:

這里主要功能就是將uart_used變量值置為0,表示臨界資源處于可使用狀態。
本系統主要用到了STC89C52RC單片機的定時器中斷,在中斷服務程序中編寫了進程調度代碼,該段代碼有以下要求:
·必須關閉系統中斷,進程在調度時不能被中斷,否則進程就會運行錯亂;進程結束后再打開系統中斷。
·必須在進入中斷時保護CPU上下文,離開中斷時恢復CPU上下文。
·必須清除定時器中斷,離開中斷時不需要設置它,因為硬件會自動設置。
·對以上三種操作,在進入中斷服務程序時,最好先關閉系統中斷,然后保護CPU上下文,最后清定時器中斷標志;離開中斷服務程序時,先恢復CPU上下文,最后打開系統中斷。
基于STC89C52RC單片機的定時器中斷服務程序偽代碼如下:

保護CPU上下文沒有出現ACC、PSW、B寄存器,這是因為STC89C52RC單片機會自動對它們進行壓棧保護;保護CPU上下文出現的PUSH X對應恢復CPU上下文出現的POP X匯編指令,表示對X號寄存器進行壓棧和出棧。
8051系列單片機在片內RAM中有4個不同的工作寄存器組,每個寄存器組包含8個工作寄存器R0-R7。
本節主要是在第4節功能的基礎上完成對進程的運行操作,這樣就達到了該系統最終設計目標。進程的運行操作主要有三種:進程創建、進程調度和進程刪除。
進程在系統中是分配資源的單位,本系統通過二維數組unsigned char idata Task_Stack[MAX_TASK][S_DEPTH]給每個進程分配相應資源。從這里可看出,系統可以最多創建MAX_TASK個進程,每個進程最多占用S_DEPTH片內RAM資源,這里關鍵字idata也可以換成xdata,但是建議用片內資源。進程創建函數偽代碼如下:

參數Task_P、Task和Msg分別表示進程優先級、進程入口程序和進程消息。
進程調度主要完成進程使用完預定時間片后對另外一個進程進行調度運行的功能,該代碼段編寫在定時器中斷服務程序中。其偽代碼如下:任務


進程刪除即把一個不再有價值的進程刪除,空出資源供其它進程利用。進程刪除主要是在任務列表上清除任務標志,并清除進程控制塊和其占用的資源。其偽代碼如下:

當前系統通過STC89C52RC單片機模擬運行,運行操作流程如下:
1. 在系統主函數中創建相應的任務,代碼截圖如圖6。
2. 編譯工程。
3. 正確連接STC89C52RC單片機開發板,下載hex文件需要STC-ISP專用軟件,圖7所示已經完成下載hex文件。

4. 啟動STC89C52RC單片機,通過串口調試助手工具捕獲四個進程發出的信息,如圖8所示。

隨著公安業務的不斷前進與發展,對便攜式設備和安全證卡類有限資源的裝備材料需求越來越多,作者通過一個小資源單片機實現了一個小的并發系統,可以應用于便攜式設備和證卡等小芯片資源中,該系統是一個可以完成需要并發執行的多應用任務平臺。
該系統目前還有其局限性,但經過測試,在滿足目前公安的一些應用上是可行的。以后可以替換目前在應用的單線程應用模式,擴展了后期應用思路。
[1] William Stallings著.陳向群譯. 操作系統精髓與設計原理.電子工業出版社,2010.
[2] 徐愛鈞,彭秀華.著. Keil Cx51 單片機高級語言編程與uVision2. 電子工業出版社,2008.
[3] 楊學昭,王東云,著.單片機原理、接口及應用(含51).西安電子科技大學出版社,2009.