錢海亮,錢仇圣
(1.大連理工大學,大連116620; 2.蘇州大學)
錢海亮(本科生)、錢仇圣(碩士研究生),研究方向為嵌入式系統應用。
目前,大多數嵌入式系統編程是針對單用戶程序,即芯片中只有一個程序。有些情況下,用戶希望在芯片中駐留多個用戶程序,并能方便更新和選擇運行,這就提出了多用戶在線編程的需求。隨著制造工藝的進步,芯片由8位發展到16位、32位,集成的Flash和 RAM也越來越大。這給多用戶在線編程提供了基礎,而集成的Flash模塊給在線編程提供了可能[1]。芯片的發展及資源變化如表1所列。

表1 芯片發展及資源變化
嵌入式系統中的多用戶在線編程是指,在芯片中駐留一個監控程序,負責下載PC機編譯后的用戶程序到指定的Flash區域,以及根據用戶的選擇來運行指定的用戶程序。多用戶在線編程與單用戶在線編程的區別是,多用戶程序共享系統資源,極大地提高了資源的利用率,但某一時刻只有監控程序或一個用戶程序運行。
本文以飛思卡爾公司推出的內部集成USB2.0模塊的32位微控制器MCF52223為例,在分析監控程序、中斷向量重定位、全局變量訪問等關鍵技術的基礎上,設計并實現了用于機器人開發平臺的多用戶在線編程系統。
監控程序類似于操作系統的內核,是多用戶在線編程的核心技術。復位后首先啟動監控程序,主要負責通過USB接口下載PC機的多用戶程序。監控程序涉及的主要模塊包括:USB通信模塊、Flash擦除與寫入模塊、用戶程序選擇運行模塊、中斷模塊。通過 USB模塊和Flash擦除與寫入模塊下載多個用戶程序,由用戶程序選擇運行模塊選擇某個用戶程序運行,從而實現多用戶在線編程。
MCF52223集成了USB 2.0模塊[3],可方便、高效地與PC機通信,下載多用戶程序。檢驗正確后,將接收到的用戶程序交給Flash擦除與寫入模塊處理。數據包協議格式如下(數據長度小于512字節):

Flash擦除與寫入模塊負責將用戶程序寫入用戶區所在的Flash中,從而實現多用戶程序的下載。MCF52223擁有256 KB的 Flash,分為32個扇區,每個扇區分為4頁,每頁為2 048字節[4]。擦除的最小單位為一頁,因此在設計多用戶在線編程系統時,給每個用戶分配的空間以頁為單位[3]。系統預留6個大小為32 KB的用戶區,即最多6個用戶在線編程。
監控程序是多用戶在線編程的核心,是芯片首先執行的代碼。其主要功能是初始化USB通信模塊和Flash擦除與寫入模塊,并通過USB下載用戶程序,如圖1所示。
在全局變量初始化中聲明unsigned char UserFlag=0,聲明指針unsigned short*Time=(unsigned short*)0x20000400。UserFlag用于保存選擇的用戶程序。指針Time所指向的區域用于保存定時器中斷次數,使得用戶區和監控程序能共享全局變量。

圖1 監控程序執行流程
單用戶在線編程系統中每個中斷只有一個中斷服務程序,中斷產生后直接跳轉到該中斷服務程序中運行,實現起來比較簡單[2]。而對于多用戶在線編程系統,每個用戶程序都可以添加自己的中斷服務程序,即對于一個中斷號會有多個不同用戶的中斷服務程序,由原來一對一的關系轉變為一對多的關系。中斷向量重定位技術就是用來解決這個難題的。
當選擇某個用戶程序運行時,全局變量UserFlag記錄了用戶號,產生中斷后會從監控程序的中斷向量表中查找中斷服務程序的入口地址。但由于是多用戶編程,還需根據當前用戶程序標志UserFlag查找中斷向量重定位表,得到當前用戶程序的相應中斷程序入口地址,并跳轉到當前用戶相應中斷程序執行(即由傳統的直接跳轉轉變成多級間接跳轉),如表2所列。中斷執行流程如圖2所示。

表2 中斷向量重定位表

圖2 中斷執行流程
每個用戶程序中有一張中斷向量重定位表,用于跳轉到用戶編寫的中斷服務子程序。每個用戶區的中斷服務程序的函數名已經固定好,用于指定入口地址。
舉例說明:在用戶程序2中開啟了 UART1接收中斷。當監控程序將控制權交給用戶程序2后,用戶程序2處于運行狀態(UserFlag=2)。如果此時 UART1接收到數據,就會向MCU發出 UART中斷(0x4E)請求。MCU立即響應該中斷,并跳轉到中斷向量表中該中斷對應的中斷服務程序的入口地址處(_Uart1_handler)運行。在該中斷服務程序中根據UserFlag跳轉到用戶程序2的中斷向量重定位表User2Vector[1](1表示在用戶程序中的中斷重定位號),并開始執行真正的中斷服務程序。
在多用戶編程系統中還需解決的問題是,監控程序中定義的變量如何在多用戶程序中共享。在用戶程序中可能需要訪問監控程序中定義的全局變量,但由于用戶程序和監控程序是分開編譯的,所以用戶程序無法直接訪問監控程序中定義的全局變量。例如,將MCF52223的定時器中斷設為1 ms,用戶程序希望通過查詢系統時鐘的方式控制小燈每隔1 s亮滅一次。因此,必須在監控程序中添加全局變量,以記錄中斷的次數。用戶程序查詢該全局變量,記錄第一次的值t1,并將再次讀得的值t2和 t1比較。當t2-t1>=1 000時便點亮小燈,同時更新t1的值t1=t2。有以下3種方法可實現全局變量的訪問。
在MCF52223中可以使用的數據寄存器有D0~D7[3],主要用來保存操作數或運算結果等信息。它們的存在節省了存取操作數所需占用總線和訪問存儲器的時間。寄存器資源比較少,而且寄存器是CPU使用的,因此用戶程序在使用前需要將寄存器的值進棧,用完后立即恢復。由于用戶程序是不定期地訪問寄存器,所以需要頻繁地進出棧,而且在C語言工程中直接操作寄存器需要嵌入匯編代碼,使用起來不方便,還會破壞程序的整體風格。
RAM是指隨機存取存儲器,存儲單元的內容可按需隨意取出或存入,且存取的速度與存儲單元的位置無關。這種存儲器在斷電時將丟失其存儲內容,故主要用于存儲短時間使用的程序。每個單片機上都集成了一定容量的RAM,用于程序的運行、變量的存儲以及系統堆棧的開辟。程序中定義的全局變量都是在RAM中分得的一塊空間,而變量名只是地址的代號,因而可以使用地址直接存取RAM。
對Flash存儲器的讀寫不同于一般的RAM讀寫,需要專門的編程。Flash有兩種基本操作:擦除(Erase)和寫入(Program)。擦除操作的含義是將存儲單元的內容由二進制的0變成1;而寫入操作的含義,是將存儲單元的內容由二進制的1變成0。對Flash的寫入相當于對其執行邏輯與的操作,邏輯與的結果即Flash的內容。在執行寫入操作之前要確保該區域是空白的(存儲單元內容為$FF),即同一塊Flash擦除后只能寫一次。因此,在寫Flash之前一般都要先執行擦除操作。
雖然RAM的效率較寄存器低,但是比Flash提升了很多,而且可以用變量或指針來操作,使用比較簡單。因而,最終確定使用RAM來實現多用戶在線編程的全局變量共享。實現方法:定義unsigned short類型的指針指向地址為0x20000400所在的RAM區。
unsigned short*p;
p=(unsigned short*)0x20000400;
系統每毫秒產生一次定時器中斷,在中斷服務程序中將指針的值加1,即(*p)++。在用戶程序中也可以定義指針,同樣指定到地址為0x20000400所在的RAM區,也可以跟監控程序一樣使用地址來共享。
隨著機器人教育的普及,采用多用戶程序在線編程技術的教育機器人開發平臺隨之而產生。教育機器人開發平臺分為3部分:外圍設備、主控板及軟件平臺。學生通過軟件平臺生成多個用戶程序,通過 USB將編譯后的用戶程序下載到主控板的不同用戶空間中??梢岳冒存I選擇不同的用戶程序運行,搭配外圍設備即可實現用戶的功能。
在分析并解決了前面幾個關鍵問題后,設計的監控程序完全能滿足多用戶在線編程的要求。通過使用指針的方法在多用戶程序中共享監控程序中定義的全局變量,如本設計中的系統時鐘。本文使用了USB接口,因而支持即插即用,并且高通信速率和有效的校驗保證了用戶程序快速、高效的下載,為多用戶在線編程提供了高可靠性。
多用戶程序在線編程技術建立在監控程序的基礎上,是對單用戶程序在線編程技術的一種改進,使硬件資源得以充分利用。文中以MCF52223芯片為例設計的多用戶程序在線編程系統,可穩定地應用于教育機器人開發平臺。實踐表明,多用戶在線編程運行穩定、方便更新,具有一定的推廣價值。但是有關在線編程技術的文獻資料比較少,特別是多用戶程序在線編程方面,因此,涉及的相關細節還需進一步研究。
[1]王宜懷.嵌入式應用在線編程開發系統的研制[J].計算機工程,2002,28(12):22-24.
[2]殷樹明.嵌入式系統中多用戶程序在線編程技術[J].計算機工程,2009,35(5):37-39,43.
[3]Freescale.Freescale MCF52223 MCF52223RM[OL].2004[2009-11].http://www.freescale.com,2004.
[4]Freescale.Freescale MCF52223 DataSheet[OL].2004[2009-11].http://www.freescale.com.
[5]鄧宗明,蔣祺明.基于PowerPC開發板的Flash編程方法與實現[J].計算機工程,2004,30(1):168-170.
[6]Morton Todd D.嵌入式微控制器[M].嚴雋永,譯.北京:機械工業出版社,2005.