【arduino】在Arduino上运行FreeRTOS操作系统,freeRTOS入门教程helloword
關(guān)注、星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容
編輯:Tony來源:公眾號(hào)TonyCode我們從一開始接觸Arduino編程就知道,Arduino程序結(jié)構(gòu)由setup()和loop()兩部分組成,我們需要反復(fù)執(zhí)行的代碼要放在loop()中,并且這些代碼一般都是順序執(zhí)行的。
隨著我們需要實(shí)現(xiàn)的功能越來越復(fù)雜,這種順序執(zhí)行的方式很難達(dá)到實(shí)時(shí)性,這個(gè)時(shí)候就需要使用操作系統(tǒng)了,就類似于我們的PC機(jī),可以同時(shí)運(yùn)行多個(gè)軟件,你可以一邊聊QQ一邊看電影,或者你用手機(jī)一邊聽歌一邊看這篇文章。當(dāng)然PC機(jī)和手機(jī)的處理器要強(qiáng)大的太多太多了,而我們的Arduino UNO開發(fā)板上使用的是一顆8位的AVR單片機(jī)。
接觸過嵌入式的朋友都知道,我們會(huì)在ARM處理器上使用Linux系統(tǒng),而在STM32這種較ARM低端而又比單片機(jī)強(qiáng)大的MCU上一般會(huì)使用更輕量級(jí)的實(shí)時(shí)操作系統(tǒng),類似的如UCOS、FreeRTOS、RTThread等。習(xí)慣了STM32上運(yùn)行FreeRTOS,真的沒有想過在Arduino上來運(yùn)行,最近發(fā)現(xiàn)了被移植到Arduino上運(yùn)行的FreeRTOS實(shí)時(shí)操作系統(tǒng),趕緊來嘗試下。
1
安裝Arduino FreeRTOS庫(kù)
在Arduino IDE中,點(diǎn)擊「項(xiàng)目」—「加載庫(kù)」—「管理庫(kù)」,在搜索欄輸入"FreeRTOS",查找并安裝庫(kù)。
2
Arduino FreeRTOS的使用
Arduino FreeRTOS庫(kù)可運(yùn)行于Arduino AVR設(shè)備,如Uno、Leonardo、Mega等。本篇使用Uno開發(fā)板。
首先要包含Arduino FreeRTOS庫(kù)的頭文件。
#include?<Arduino_FreeRTOS.h>我們使用xTaskCreate()函數(shù)來創(chuàng)建任務(wù),函數(shù)原型為:
xTaskCreate(TaskFunction_t?pvTaskCode,const?char?*?const?pcName,uint16_t?usStackDepth,void?*?pvParameters,UBaseType_t?uxPriority,TaskHandle_t?*?pxCreatedTask)創(chuàng)建任務(wù)時(shí)需要傳入6個(gè)參數(shù):
pvTaskCode:任務(wù)函數(shù)。
pcName:任務(wù)名稱,一般用于調(diào)試和追蹤。
usStackDepth:任務(wù)堆棧,內(nèi)核在創(chuàng)建任務(wù)時(shí)將其分配給任務(wù)。該值指定堆棧可以容納的字?jǐn)?shù),而不是字節(jié)數(shù)。例如,如果堆棧為32位寬,并且usStackDepth作為100傳入,那么將在RAM中分配400字節(jié)的堆棧空間(100 * 4字節(jié))。合理使用此項(xiàng),因?yàn)锳rduino Uno只有2KB的RAM。
pvParameters:任務(wù)輸入?yún)?shù)(可以為NULL)。
uxPriority:任務(wù)優(yōu)先級(jí)(0是最低優(yōu)先級(jí))。
pxCreatedTask:可用于向正在創(chuàng)建的任務(wù)傳遞句柄。然后,可以使用此句柄在API調(diào)用中引用任務(wù),例如,更改任務(wù)優(yōu)先級(jí)或刪除任務(wù)(可以為NULL)。
本次實(shí)驗(yàn)創(chuàng)建兩個(gè)串口打印任務(wù):
xTaskCreate(TaskPrint1,?"Print1",?128,?NULL,?1,?NULL); xTaskCreate(TaskPrint2,?"Print2",?128,?NULL,?2,?NULL);其中任務(wù)2有更高的優(yōu)先級(jí),會(huì)首先執(zhí)行。
創(chuàng)建任務(wù)后,使用vTaskStartScheduler()函數(shù)啟動(dòng)任務(wù)調(diào)度。
創(chuàng)建任務(wù)實(shí)現(xiàn)函數(shù)。一般結(jié)構(gòu)如下:
void?task(void?*param) {while(1){....//需要執(zhí)行的代碼} }大多數(shù)代碼都需要延遲函數(shù)來停止正在運(yùn)行的任務(wù),但是在RTOS中,不建議使用Delay()函數(shù),因?yàn)樗鼤?huì)停止CPU,因此RTOS也將停止工作。因此,FreeRTOS具有內(nèi)核API,可以在特定時(shí)間內(nèi)阻止任務(wù):
vTaskDelay(const?TickType_t?xTicksToDelay)例如延時(shí)1秒:
vTaskDelay(1000?/?portTICK_PERIOD_MS)其中portTICK_PERIOD_MS與實(shí)際MCU的時(shí)鐘頻率相關(guān)。
3
本實(shí)驗(yàn)代碼如下,拷貝編譯下載。
程序下載
4
實(shí)驗(yàn)現(xiàn)象
打開串口監(jiān)視器,波特蘭設(shè)置與程序中一致的9600,會(huì)看到任務(wù)2先運(yùn)行打印,由于任務(wù)1等待1秒,任務(wù)2等待2秒,所以每次打印任務(wù)1兩次,打印任務(wù)2一次。
實(shí)驗(yàn)現(xiàn)象你點(diǎn)的每個(gè)贊,我都當(dāng)成喜歡
總結(jié)
以上是生活随笔為你收集整理的【arduino】在Arduino上运行FreeRTOS操作系统,freeRTOS入门教程helloword的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【s操作】轻松优雅的保存微信群图片和朋友
- 下一篇: 【S操作】冰箱正常运行监控系统需求整理