王 磊,王宜懷,姚望舒,范寧寧
(蘇州大學 計算機科學與技術學院,江蘇 蘇州 215006)
MQXLite操作系統(tǒng)在ARM Cortex-M0+/M4上的移植研究與實現(xiàn)*
王 磊,王宜懷,姚望舒,范寧寧
(蘇州大學 計算機科學與技術學院,江蘇 蘇州 215006)
在分析 MQXLite組織架構的基礎上,針對其過于依賴處理器專家(Processor Expert,PE)軟件造成支持芯片有限的問題,提出了一個通用的MQXLite工程框架模板“AMQXLiteFW”。利用此模板在ARM Cortex-M0+/M4芯片上實現(xiàn)了MQXLite的移植,并從啟動流程、中斷系統(tǒng)、系統(tǒng)定時器及應用任務這幾個方面詳細介紹了移植過程。最后在KW01及CC3200兩款不同內核、不同廠商的芯片上進行了MQXLite的移植測試,測試結果顯示了此框架模板的可移植性與通用性。
MQXLite;ARM Cortex-M0+/M4;實時操作系統(tǒng)移植;通用工程框架模板
MQXLite操作系統(tǒng)是飛思卡爾公司維護的一款開源的嵌入式實時操作系統(tǒng),是已有十幾年穩(wěn)定實踐運行經(jīng)驗的標準版 MQX(Message Queue eXecutive)嵌入式實時操作系統(tǒng)的輕量級版本,專門針對ARM Cortex-M系列中資源有限的MCU開發(fā),目前僅支持M0+/M4內核的MCU,具有內核精簡、資源占用低(低于4K RAM)、執(zhí)行效率高等特點[1]。
目前的 MQXLite集成在飛思卡爾公司的圖形化快速程序設計工具——處理器專家(Processor Expert,PE)里,作為其中的一個組件提供,使用獨立的PE軟件套件或是集成了PE的開發(fā)環(huán)境(CodeWarrior或Kinetis Design Studio)可以方便地構建一個基于MQXLite的工程,實現(xiàn)MQXLite在PE支持芯片上的移植。但此種移植方式過度依賴于PE軟件,移植的通用性與靈活性不足,不利于工程在PE不支持的芯片平臺上移植。
針對此缺陷,本文對PE中生成的MQXLite代碼進行了整理與修改,提出了一種改良版的MQXLite組織架構,使得其脫離PE可獨立配置,并利用此架構構建了一個通用的工程框架模板“AMQXLITEFW”。在此框架下,分別實現(xiàn)了MQXLite在M0+內核的飛思卡爾KW01芯片及M4內核的德州儀器CC3200芯片上的移植,拓展了MQXLite的適用平臺。
1.1 MQXLite的組織架構
通過分析MQXLite源碼包的構成,并與PE中生成的完整MQXLite工程代碼相比較,可以得出PE下MQXLite組織架構的各部分組成如下:
KERNEL:MQXLite的微內核,是標準版MQX內核的精簡。具有基于優(yōu)先級的搶占式任務調度、中斷處理及任務間的同步與通信(輕量級)等核心功能。
PSP:處理器支持包(Processor Support Package,PSP),包含了MQXLite操作系統(tǒng)的上下文切換、中斷控制等與芯片內核密切相關的功能。
LDD:PE中提供的邏輯設備驅動(Logic Device Drivers,LDD),用來實現(xiàn)對外設I/O的訪問。
BSP:板級支持包(Board Support Package,BSP),包含與具體芯片及電路板相關的時鐘、中斷初始化等內容,通過圖形化的參數(shù)配置后,由PE自動生成。
TASK:應用任務,用于實現(xiàn)具體的應用功能。
在此架構中,KERNEL及 PSP的代碼都源于MQXLite的源碼包,其中 KERNEL部分是通用代碼,而PSP中穿插有部分 LDD及PE生成代碼;LDD及BSP部分的代碼則完全是通過配置PE自動生成,因不同的目標芯片及實際電路板的具體情況而異;TASK中的應用任務代碼根據(jù)實際需求編寫,部分與特定平臺相關的應用任務也會調用PE生成的LDD代碼。
由此可見,此架構下的MQXLite與PE被緊密地捆綁在了一起。利用此架構,雖然可以在PE的幫助下快速便捷地完成 MQXLite在部分目標芯片上的移植,但若想將MQXLite移植到PE不支持的芯片平臺上,實現(xiàn)起來較為困難。
可行的解決方案是設法將MQXLite從PE中獨立出來,使其能夠脫離PE單獨配置,并根據(jù)目標芯片選用第三方的驅動程序來訪問外設I/O,這樣就增強了MQXLite的移植靈活性與通用性,拓展了MQXLite的適用芯片平臺?;谝陨纤枷?,本文對此架構中的組成內容進行了適當?shù)男薷?,提出了一種改良版的 MQXLite組織架構,架構中各組成部分如下:
KERNEL:使用MQXLite源碼包中提供的KERNEL代碼。
PSP:使用MQXLite源碼包中提供的 PSP代碼,用自行編寫的通用代碼替換PE生成代碼。
DRIVER:使用第三方驅動而不是PE中的LDD來實現(xiàn)對外設I/O的訪問。
BSP:自行編寫通用的時鐘、中斷初始化函數(shù),并利用宏常量的方式傳遞參數(shù),方便根據(jù)具體芯片及電路板的情況來進行配置修改。
TASK:保留應用任務代碼不變,只在調用到外設I/O驅動時將LDD驅動替換為Driver中的第三方驅動程序。
兩種組織架構的對比如圖1所示。相比PE下的MQXLite組織架構,此改良版的架構有獨立、通用、靈活的特點。
1.2 通用的工程框架模板
為了供移植時參考,本文結合上文提出的改良版MQXLite組織架構與本實驗室提出的基于標準版 MQX的工程框架“AMQXFW”,提出了一個面向MQXLite的通用工程框架模板 “AMQXLiteFW”,其在 Kinetis Design Studio 3.0(KDS 3.0)集成開發(fā)環(huán)境下的工程組成如圖2所示[2]。
圖1 兩種MQXLite組織架構的對比
圖2 AMQXLITEFW在KDS 3.0下的目錄結構
工程框架中的 MQXLite文件夾存放操作系統(tǒng)的相關文件,包含 6個子文件夾:app、bsp、psp、kernel、include及config。其中app對應組織架構中的“TASK”,bsp即架構中的 “BSP”,include、kernel及 psp共同組成了“KERNEL”及“PSP”;config則存放了 MQXLite的配置文件,用于MQXLite內核功能的裁剪。
該工程框架模板組織結構清晰,內容簡單明了,便于工程的移植。
利用上文提出的AMQXLiteFW通用工程框架模板及相應的第三方驅動程序,可以方便地實現(xiàn)MQXLite在任何ARM Cortex-M0+/M4內核芯片上的移植。下面從啟動流程、中斷系統(tǒng)、系統(tǒng)定時器及應用任務這幾個方面介紹移植的過程。
2.1 啟動流程
使用 MQXLite的工程需要一個新的復位向量函數(shù)Reset_Handler(),以便于在通用的初始化操作之前完成一些與操作系統(tǒng)相關的額外設置。此函數(shù)用匯編語言編寫,位于boot.S文件中,主要實現(xiàn)如下功能:
(1)重置外設中斷狀態(tài)。通過對NVIC相關寄存器的操作來關閉所有外設中斷并清除所有掛起中斷標志。其中由于M0+內核與M4內核所支持的最大外設中斷數(shù)目不同(M0+:32,M4:240),所以在移植時可根據(jù)目標MCU的類型宏定義來條件編譯不同的代碼。
(2)切換棧指針。芯片復位后默認使用主棧指針(Main Stack Pointer,MSP),而操作系統(tǒng)在運行應用任務時使用進程棧指針(Process Stack Pointer,PSP),只有在進入異?;蛑袛鄷r才使用MSP。所以在復位向量函數(shù)中需要將CONTROL寄存器的第 1位置1,實現(xiàn)從MSP到PSP的切換。此部分M0+內核與M4內核一致,無需修改。
(3)FPU相關設置。若目標芯片為M4內核且具有浮點運算單元FPU并決定在MQXLite中使用,則對系統(tǒng)控制塊SCB的CPACR及FPCCR寄存器進行設置,開啟芯片的FPU協(xié)處理器,并關閉硬件在進入異常時對FPU相關寄存器的自動壓棧操作。
2017年2月,工業(yè)和信息化部、民政部、國家衛(wèi)生計生委印發(fā)《智慧健康養(yǎng)老產業(yè)發(fā)展行動計劃(2017—2020年)》,計劃在5年內建設500個智慧健康養(yǎng)老示范社區(qū),意味著我國的智慧養(yǎng)老已駛入發(fā)展快車道。為充分響應國家供給側結構性改革要求,從供給質量出發(fā),提高有效供給和增強供給結構對需求變化的適應性和靈活性[7],智慧養(yǎng)老服務發(fā)展模式勢在必行。因此,有必要對智慧養(yǎng)老系統(tǒng)平臺的搭建進行闡述和優(yōu)劣分析,有利于引導更多的第三方服務機構入駐智慧養(yǎng)老服務體系,更有利于擴大智慧養(yǎng)老服務的范圍和提高服務的專業(yè)化水平。
結束以上操作后,跳轉到無操作系統(tǒng)下的通用啟動流程,然后進入應用主函數(shù)main(),在其中調用_mqxlite_ init()及_mqxlite()函數(shù)來初始化并啟動MQXLite操作系統(tǒng)。
2.2 中斷系統(tǒng)
MQXLite的中斷處理過程分為兩個相對獨立的部分:內核ISR與用戶ISR。內核ISR函數(shù)_int_kernel_isr用匯編語言編寫,以便能快速的響應中斷,它完成PSP與MSP之間的切換與上下文的保存,實現(xiàn)硬件中斷到用戶ISR的映射;用戶ISR則通常用C語言編寫,與無操作系統(tǒng)下的中斷服務例程一致,用于處理各種中斷事件[3]。
鑒于這種情況,MQXLite在維護ROM中的硬件中斷向量表之外,還維護了一個存儲在RAM中的用戶中斷向量表。在移植時,需要將硬件中斷向量表中的系統(tǒng)定時器中斷向量及所有外設中斷向量都預設為內核ISR函數(shù),以作為它們的通用入口,接著在應用任務中調用_int_install_isr()函數(shù)將對應外設的用戶 ISR注冊到用戶中斷向量表中。這樣當中斷到來時,首先會進入內核ISR,然后再查找用戶中斷向量表,轉到相應的用戶ISR,實現(xiàn)外設硬件中斷到用戶編寫的中斷服務例程之間的映射。整個中斷處理流程如圖3所示。
圖3 MQXLite中斷處理流程
內核ISR與處理器所用內核有關,位于dispatch.S文件中。此文件可直接從MQXLite源碼包中獲取,并已針對M0+內核及M4內核提供了不同版本,移植時根據(jù)需要進行替換即可。用戶ISR在移植時可保持與無操作系統(tǒng)下的外設ISR代碼基本一致。
2.3 系統(tǒng)定時器
MQXLite使用 Cortex-M內核中共有的 Systick定時器作為系統(tǒng)定時器,為操作系統(tǒng)提供系統(tǒng)節(jié)拍,用于任務的調度,其初始化代碼調用了PE中的LDD驅動。為了擺脫PE,在AMQXLiteFW框架中使用了自行編寫的更為簡單通用的 systick_init()函數(shù)來代替 LDD驅動實現(xiàn)Systick定時器的初始化,然后調用 _int_install_isr()函數(shù)將 MQXLite內核中的滴答處理例程 _time_notify_kernel()注冊到Systick的中斷向量中,實現(xiàn)MQXLite操作系統(tǒng)與Systick定時器的關聯(lián)。在移植時只需根據(jù)具體應用需求,修改bsp.h頭文件中宏定義BSP_ALARM_FREQUENCY的值(單位:Hz),即可改變系統(tǒng)定時器的節(jié)拍頻率。
MQXLite不支持動態(tài)任務創(chuàng)建,所以需要在編譯時靜態(tài)地為所有任務預先分配好任務??臻g,并在任務模板列表MQX_template_list中登記任務的相關屬性。
MQXLite只支持基于優(yōu)先級的搶占式先入先出任務調度方式。為了觸發(fā)任務,在此框架中會固定地創(chuàng)建自啟動任務task_main,用于外設硬件模塊初始化及其他任務的創(chuàng)建。此任務執(zhí)行完后會自我阻塞,操作系統(tǒng)開始根據(jù)優(yōu)先級的高低對就緒隊列中的任務進行調度[4]。
在移植應用任務時,為了協(xié)調任務間的執(zhí)行順序,既可以使用輕量級的事件、信號量、消息隊列等任務同步組件函數(shù),也可以在任務循環(huán)體最后調用 _time_delay_ ticks()等延時函數(shù)來主動放棄 CPU的占用權[5]。
為了檢驗提出的AMQXLiteFW框架及移植流程的通用性與有效性,本文在KW01及CC3200這兩款不同內核、不同廠商的MCU上進行了MQXLite的移植測試。
3.1 KW01移植測試
KW01為飛思卡爾公司推出的基于ARM Cortex-M0+內核的Sub-GHz無線MCU,可工作在290~1 020 MHz的無線頻率范圍內,最高主頻 48 MHz,擁有 128 KB的ROM及16 KB的SRAM。由于在PE V3.0.0之前并不支持這款芯片,所以利用本文提出的框架及本實驗室自行編寫的KW01外設驅動程序來構建MQXLite移植測試工程。
測試工程程序分為兩個部分:發(fā)送節(jié)點程序與接收節(jié)點程序。發(fā)送節(jié)點程序通過ADC內部通道采集芯片溫度及電源電壓等信息,在收到問詢幀后回發(fā)相關數(shù)據(jù)。接收節(jié)點程序對從串口接收到的PC端命令進行無線轉發(fā),并將收到的無線數(shù)據(jù)通過串口上傳到PC端。
移植完成后在 KDS 3.0開發(fā)環(huán)境里編譯工程并下載到測試節(jié)點中進行測試,PC端軟件運行結果可看出使用MQXLite的芯片運行正常,實現(xiàn)了目標功能。
3.2 CC3200移植測試
CC3200是德州儀器公司推出的基于ARM Cortex-M4內核的 WiFi無線 MCU,支持 Wi-Fi 802.11 b/g/n及TCP/IP協(xié)議棧,主頻80 MHz,最高擁有 256 KB的 SRAM。此芯片的生產廠商并非飛思卡爾公司,故PE對其并不支持,測試工程利用本文提出的框架及德州儀器公司提供的外設驅動程序,嘗試將 MQXLite操作系統(tǒng)移植到此芯片中。
測試程序將CC3200配置為AP模式,與存儲在外部Flash中的網(wǎng)頁進行交互,根據(jù)網(wǎng)頁上傳來的信息控制測試板上指示燈的亮滅,并從串口輸出網(wǎng)頁上發(fā)送過來的字符串信息。
移植完成后在IAR 7.2 IDE里編譯工程并下載到測試板,PC或手機連接到CC3200的WiFi熱點,通過瀏覽器訪問內置網(wǎng)頁進行通信與控制測試,測試結果與預期目標一致,說明MQXLite移植成功。
移植測試的結果驗證了本文提出的AMQXLiteFW框架的可移植性與通用性。此框架使得MQXLite可以脫離PE移植到任何廠商的 ARM Cortex-M0+/M4芯片上,為MQXLite在不同平臺上的移植提供了借鑒。此外,為了進一步提高此框架的通用性,還可以繼續(xù)研究修改MQXLite的相關代碼,使其兼容 ARM Cortex微控制器軟件接口標準(CMSIS),并統(tǒng)一外設驅動的接口,使得工程更便于移植。
[1]Freesca1e Semiconductor.MQXLite Real-Time Operating System User Guide.Rev 1.1[EB/OL].(2014-4-2).http:// cache.freescale.com/files/soft_dev_tools/doc/user_guide/ MQXLITEUG.pdf.
[2]王宜懷,朱仕浪,姚望舒.嵌入式實時操作系統(tǒng) MQX應用開發(fā)技術-ARM Cortex-M微處理器[M].北京:電子工業(yè)出版社,2014.
[3]石晶,王宜懷,蘇勇,等.基于 ARM Cortex-M4的 MQX中斷機制分析與中斷程序框架設計[J].計算機科學,2013,40(6):41-44.
[4]ZHAO T,LONG D.Analysis on task scheduling operating mechanism of embedded real-time operating system MQX[C]. Mechatronic Sciences,Electric Engineering and Computer (MEC),Proceedings 2013 International Conference on.IEEE,2013:1844-1847.
[5]周航慈,吳光文.基于嵌入式實時操作系統(tǒng)的程序設計技術[M].北京:北京航空航天大學出版社,2006.
The study and implementation of porting MQXLite RTOS to ARM Cortex-M0+/M4
Wang Lei,Wang Yihuai,Yao Wangshu,F(xiàn)an Ningning
(College of Computer Science and Technology,Soochow University,Suzhou 215006,China)
Base on the analysis of MQXLite organization structure,a general project framework template for MQXLite is introduced, which targets MQXLite's limited device support issue caused by the overreliance of Processor Expert(PE).This template helps porting MQXLite to an ARM Cortex-M0+/M4 chip,and the porting process including startup process,interrupt system,system timer and application task is also elaborately introduced.At last,two porting tests are conducted on two chips:KW01 and CC3200, which have different cores and vendors.The test result shows the portability and universality of this template framework.
MQXLite;ARM Cortex-M0+/M4;RTOS porting;general project template
TP316.2
A
10.16157/j.issn.0258-7998.2015.11.007
王磊,王宜懷,姚望舒,等.MQXLite操作系統(tǒng)在 ARM Cortex-M0+/M4上的移植研究與實現(xiàn)[J].電子技術應用,2015,41(11):27-30.
英文引用格式:Wang Lei,Wang Yihuai,Yao Wangshu,et al.The study and implementation of porting MQXLite RTOS to ARM Cortex-M0+/M4[J].Application of Electronic Technique,2015,41(11):27-30.
2015-07-24)
王磊(1987-),男,碩士研究生,主要研究方向:嵌入式系統(tǒng)。
國家自然科學基金資助項目(61070169)
王宜懷(1962-),男,博士,教授,主要研究方向:嵌入式系統(tǒng)、傳感網(wǎng)與智能控制技術。
姚望舒(1975-),男,博士,副教授,主要研究方向:機器學習、模式識別、圖像篡改取證。