崔業(yè)梅 楊煥崢
1.無錫商業(yè)職業(yè)技術(shù)學院;2.江蘇省無線傳感系統(tǒng)應用工程技術(shù)研究開發(fā)中心
為了解決物聯(lián)網(wǎng)網(wǎng)關程序的多任務協(xié)調(diào)與實時工作,研究了定時器中斷,μC/OS、FreeRTOS、RTX和RTThread嵌入式實時操作系統(tǒng)的特點。RT-Thread擁有硬實時核心,具有穩(wěn)定、實時與可剪裁的性能,是一種“小而美”的物聯(lián)網(wǎng)操作系統(tǒng),適合物聯(lián)網(wǎng)網(wǎng)關使用。分析了RTThread在物聯(lián)網(wǎng)網(wǎng)關的STM32微控制器中運行的流程,編寫了程序,利用Proteus軟件實現(xiàn)了多線程任務實時運行仿真,并在物聯(lián)網(wǎng)網(wǎng)關的STM32微控制器中穩(wěn)定運行。
研制的物聯(lián)網(wǎng)網(wǎng)關采用STM32微控制器(MCU),需要控制多個復雜的外設,有傳感器、NB-IoT通信模塊等,假設傳感器每1s啟動一次,控制傳感器需要花費0.3s,NB-IoT通信模塊每2s就要向外部發(fā)送一些信息,耗費的時間大約為0.5s,此時系統(tǒng)中還要執(zhí)行其他的一些控制,比如通過串口進行數(shù)據(jù)傳輸,使數(shù)據(jù)在液晶屏上顯示等。如果采用中斷的方式編寫程序,不是單純一個定時器中斷,會有其他的一些中斷,不能把控制傳感器和NB-IoT通信模塊的程序簡單的放在定時器中斷中去執(zhí)行。當系統(tǒng)中斷很多時,中斷時間執(zhí)行過長,將導致比它優(yōu)先級低的中斷被搶占而無法執(zhí)行,對于不支持中斷嵌套的MCU,采用這種方式,會導致一個更重要的事件被阻塞,對于支持中斷嵌套的MCU,這樣設計也不好,因為同級別的中斷一般是不可以被另外一個同級別的中斷搶占的。通常情況下,應該盡快的將中斷程序執(zhí)行結(jié)束。如何解決使物聯(lián)網(wǎng)網(wǎng)關程序不是在各個任務協(xié)調(diào)工作上耗費大量的時間,而是專注于各個任務的功能,采用嵌入式實時操作系統(tǒng)(Embedded RTOS)是一種好的解決方案,常見的RTOS有μC/OS、FreeRTOS、RTX和RT-Thread等。
μC/OS分為μC/OS-Ⅱ和μC/OS-Ⅲ,有搶占式,高度便攜式和可擴展的實時內(nèi)核,是Embedded RTOS的關鍵組件。它提供任務的調(diào)度和管理、多個任務之間的同步和通信、中斷服務等功能,擁有高效的執(zhí)行率、很小的占用空間和較好的實時性等特點。FreeRTOS是為Embedded RTOS設計的可擴展的實時內(nèi)核,能方便地移植到單片機上運行。它提供任務、時間和內(nèi)存管理、信號量和消息隊列等功能,擁有公開的源碼、靈活的調(diào)度策略、可移植和裁減和免費等特點。Keil RTX是為ARM Cortex-M微控制器設計的Embedded RTOS。擁有免版稅和確定性,能夠?qū)崟r執(zhí)行多個任務,應用程序的結(jié)構(gòu)能更好、維護更容易等特點。RT-Thread是中國的開源Embedded RTOS[1],除了有類似μC/OS和FreeRTOS的內(nèi)核外,也包括TCP/IP協(xié)議棧,虛擬文件系統(tǒng),POSIX接口,圖形用戶界面,FreeMODBUS主從協(xié)議棧,CAN框架,動態(tài)模塊等應用組件和驅(qū)動框架。商業(yè)產(chǎn)品可以免費使用其內(nèi)核和開源組件。擁有硬實時核心,穩(wěn)定、實時與可剪裁的性能等特點[2-3]。RT-Thread和μC/OS-Ⅱ的特點對比,如表1所示。
表1 RT-Thread和μC/OS-Ⅱ的特點對比Tab.1 Comparison of features between RT-Thread and μC/OS-Ⅱ
研制的物聯(lián)網(wǎng)網(wǎng)關使用RT-Thread作為EmbeddedRTOS[4]。使用Keil(MDK-ARM)軟件對STM32 MCU進行編程,首先,程序啟動后從匯編代碼startup_stm32f103 xe.s開始運行,通過編譯系統(tǒng)提供的一個函數(shù)__main(),初始化庫函數(shù)和應用程序的執(zhí)行環(huán)境。其次,RTThread的啟動用到了Keil提供的$Sub$$和$Super$$函數(shù)的功能,這個是在__CC_ARM編譯器環(huán)境中的功能,程序從啟動文件的__main()函數(shù)執(zhí)行完畢之后,會優(yōu)先執(zhí)行$Sub$$main()函數(shù),該函數(shù)包含了RT-Thread的初始化過程,通過$Sub$$main()函數(shù)的rt_thread_startup()函數(shù)來完成RT-Thread的初始化及啟動等,具體有通過rt_hw_board_init()函數(shù)實現(xiàn)STM32 HAL庫初始化、系統(tǒng)時鐘、滴答時鐘初始化、GPIO、串口初始化等,然后在rt_application_init()函數(shù)中會創(chuàng)建main線程,并將該線程設為就緒狀態(tài),main線程含有main_thread_entry()函數(shù),它是用戶應用程序main()函數(shù)的跳轉(zhuǎn)入口,當程序執(zhí)行到rt_system_ scheduler_start()函數(shù)后,此刻任務調(diào)度器已經(jīng)啟動。再次,含有$Super$$main()的線程會立即得到執(zhí)行,從而轉(zhuǎn)入到main()函數(shù)。最后,執(zhí)行在main()函數(shù)里添加的用戶應用程序初始化代碼等。如圖1所示。
圖1 RT-Thread在STM32微控制器中運行的流程Fig.1 The flow of RT-Thread running in the STM32 microcontroller
研制的物聯(lián)網(wǎng)網(wǎng)關通過傳感器采集數(shù)據(jù),通過NB-IoT通信模塊將數(shù)據(jù)傳輸?shù)轿锫?lián)網(wǎng)云平臺,在Embedded RTOS的多線程任務中,可以將這個任務分解成兩個子任務,一個子任務不間斷地讀取傳感器數(shù)據(jù),并將數(shù)據(jù)寫到共享內(nèi)存中,另一個子任務周期性的從共享內(nèi)存中讀取數(shù)據(jù),并將數(shù)據(jù)通過NBIoT通信模塊傳輸?shù)轿锫?lián)網(wǎng)云平臺。在RT-Thread中,使用線程實現(xiàn)任務,線程描述了一個任務執(zhí)行的運行環(huán)境和所處的優(yōu)先等級,根據(jù)任務的重要性不同可設置相對高低不同的優(yōu)先級,不同的任務還可以設置相同的優(yōu)先級,輪流運行[5-6]。使用Proteus軟件的VSM Studio Keil編譯器仿真RT-Thread多線程任務在STM32 MCU里實時運行,利用LED0指示燈模擬傳感器,USART1串口數(shù)據(jù)傳輸模擬NB-IoT通信模塊,編寫的Source Code里main.c文件的開頭線程定義如下:
定義了led0_thread_entry()和USART1_thread_entry()兩個線程,分別實現(xiàn)LED0閃爍和通過USART1輸出字符串。通過函數(shù)rt_thread_init()對線程進行初始化,通過函數(shù)rt_thread_startup()使線程實現(xiàn)就緒,調(diào)度器會調(diào)度就緒的線程使其進入運行,通過rt_thread_delay()等函數(shù)使運行的線程進入掛起,如果等待超時將返回就緒,通過rt_thread_delete()函數(shù)使線程實現(xiàn)關閉或線程運行結(jié)束時執(zhí)行rt_thread_exit()函數(shù)實現(xiàn)關閉。Proteus軟件仿真結(jié)果如圖2所示。
圖2 Proteus軟件的RT-Thread多線程實時運行仿真Fig.2 RT-Thread multi-thread real-time running simulation of Proteus software
在STM32 MCU中運行RT-Thread,實現(xiàn)了LED0、USART1等多線程任務的實時運行,LED0不停閃爍,USART1不斷輸出字符串“RT-Thread STM32 RealTime USART1 Test!”,解決了系統(tǒng)需要控制多個復雜的外設,如果中斷很多,中斷時間執(zhí)行過長,將導致比它優(yōu)先級低的中斷被搶占而無法執(zhí)行等問題。
研制的物聯(lián)網(wǎng)網(wǎng)關采用STM32 MCU,包含傳感器、NB-IoT通信模塊、RS-485電路、LED指示燈、繼電器和LCD等??梢酝ㄟ^多路傳感器采集數(shù)據(jù),通過NB-IoT通信模塊將數(shù)據(jù)發(fā)送到物聯(lián)網(wǎng)云平臺,可以通過云平臺下發(fā)命令控制繼電器開關。使用RT-Thread實現(xiàn)多線程任務實時運行,內(nèi)核使用了調(diào)度器,信號量等,調(diào)度器是為了創(chuàng)建多個線程來實現(xiàn)不同的工作,信號量是用來實現(xiàn)線程間的同步。組件部分使用了UART和SENSOR框架,UART框架指使用了2個串口,分別連接NB-IoT通信模塊和RS-485電路,分別用于跟物聯(lián)網(wǎng)云平臺和外設通信,SENSOR框架指使用傳感器采集數(shù)據(jù)。通過RTThread對外設進行初始化,硬件驅(qū)動初始化,各個軟件包初始化,初始化后進入傳感器采集數(shù)據(jù)、LCD顯示、RS-485數(shù)據(jù)傳輸線程,輪詢線程,如圖3所示。
圖3 基于RT-Thread的多線程任務實時運行程序框圖Fig.3 Block diagram of real-time operation of multithreaded tasks based on RT-Thread
程序包含了初始化SENSOR1、LCD和RS-485通信線程等,并開啟了它們的線程調(diào)度,SENSOR1線程的任務用于讀取溫度傳感器的數(shù)據(jù),LCD線程的任務用于將數(shù)據(jù)在液晶屏上顯示,RS-485線程的任務用于將數(shù)據(jù)傳輸給外設等,程序在研制的物聯(lián)網(wǎng)網(wǎng)關STM32 MCU中能穩(wěn)定運行。
RT-Thread擁有硬實時核心,具有穩(wěn)定、實時與可剪裁的性能,具有全搶占的Embedded RTOS內(nèi)核、輕型的TCP/IP協(xié)議棧和多窗口多線程圖形用戶界面等特點,是一種“小而美”的物聯(lián)網(wǎng)操作系統(tǒng)。分析了RT-Thread在物聯(lián)網(wǎng)網(wǎng)關的STM32微控制器中運行的流程,編寫了程序,利用Proteus軟件實現(xiàn)了多線程任務實時運行仿真,在物聯(lián)網(wǎng)網(wǎng)關的STM32 MCU中使用,能穩(wěn)定運行,解決了物聯(lián)網(wǎng)網(wǎng)關程序的多任務協(xié)調(diào)與實時工作的問題。
引用
[1] 葉宏.國產(chǎn)嵌入式操作系統(tǒng):在信息技術(shù)變遷中成長、發(fā)展與壯大[J].單片機與嵌入式系統(tǒng)應用,2021(3):3.
[2] 祎邱 ,熊譜翔,朱天龍.嵌入式實時操作系統(tǒng):RT-Thread設計與實現(xiàn)[D].北京:機械工業(yè)出版社,2019.
[3] 祎邱 .RT-Thread:兩大安全措施保障嵌入式軟件開發(fā)的安全[J].電子產(chǎn)品世界,2021(4):9.
[4] 陳夢亮.基于嵌入式Linux的物聯(lián)網(wǎng)網(wǎng)關設計與實現(xiàn)[D].長沙:湖南大學,2020.
[5] 孫晉.基于北斗短報文和RT-Thread的遠程通信系統(tǒng)設計[D].南京:南京信息工程大學,2020.
[6] 張帝,權(quán)悅,國海,等.基于LoRa與RT-Thread的多功能礦燈設計[J].工礦自動化,2021(6):96-102.