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