日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【arduino】在Arduino上运行FreeRTOS操作系统,freeRTOS入门教程helloword

發(fā)布時(shí)間:2025/4/5 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【arduino】在Arduino上运行FreeRTOS操作系统,freeRTOS入门教程helloword 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

關(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ù)。

安裝庫(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)代碼如下,拷貝編譯下載。

#include?<Arduino_FreeRTOS.h>void?TaskPrint1(void?*param);?//聲明打印任務(wù)1 void?TaskPrint2(void?*param);?//聲明打印任務(wù)2void?setup()?{Serial.begin(9600);while?(!Serial);//等待串口連接后執(zhí)行xTaskCreate(TaskPrint1,?"Print1",?128,?NULL,?1,?NULL);?//創(chuàng)建任務(wù)1xTaskCreate(TaskPrint2,?"Print2",?128,?NULL,?2,?NULL);?//創(chuàng)建任務(wù)2vTaskStartScheduler();?//啟動(dòng)任務(wù)調(diào)度 }void?TaskPrint1(void?*param) {while?(1){Serial.println("TaskPrint1...");vTaskDelay(1000?/?portTICK_PERIOD_MS?);?//?等待1秒} }void?TaskPrint2(void?*param) {while?(1){Serial.println("TaskPrint2...");vTaskDelay(2000?/?portTICK_PERIOD_MS?);?//?等待2秒} }void?loop()?{}

程序下載

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。