電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Arduino的現(xiàn)代RTOS和狀態(tài)機(jī)開源分享

Arduino的現(xiàn)代RTOS和狀態(tài)機(jī)開源分享

2023-06-27 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹


傳統(tǒng)的順序 Arduino 編程

傳統(tǒng)的 Arduino 編程模型被稱為“順序編程” ,因?yàn)轭A(yù)期的事件序列通常硬編碼在阻塞調(diào)用序列中,這些阻塞調(diào)用排隊(duì)等待預(yù)期事件的到達(dá)。

例如,在標(biāo)準(zhǔn)的 Arduino Blink 示例中,您期望通過delay()兩次調(diào)用 Arduino 函數(shù)在線等待的兩個(gè)超時(shí)事件序列。

清單 1:Arduino 順序編程示例(標(biāo)準(zhǔn) Arduino Blink 示例)

void loop() {
    digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
    delay(1000); // wait for a second
    digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
    delay(1000); // wait for a second
}

這種方法適用于簡(jiǎn)單的問題,但對(duì)于更復(fù)雜的項(xiàng)目來說擴(kuò)展性很差并且很快變得不可行,在這些項(xiàng)目中你需要同時(shí)做很多事情,例如以不同的速率閃爍第二個(gè) LED。

根本問題是,當(dāng)一個(gè)順序程序在等待一種事件(例如,時(shí)間延遲)時(shí),它不做任何其他工作,也不響應(yīng)其他事件(例如,不同的時(shí)間延遲或按鈕按下) .

Arduino編程無阻塞

由于這些原因,更有經(jīng)驗(yàn)的 Arduino 程序避免阻塞(或輪詢)并在線等待事件,例如dealy()函數(shù)。相反,程序僅檢查感興趣的條件(使用顯式if()語句)并僅在檢測(cè)到事件時(shí)處理事件。在任何情況下,Arduinoloop()函數(shù)總是快速返回,這使得程序能夠響應(yīng)其他事件。

這種方法的示例包括使用 Arduinomillis()函數(shù)(例如,參見Arduino 項(xiàng)目“使用 millis() 函數(shù)作為使用 delay() 的替代方法” )。

清單 2:無阻塞的 Arduino 編程示例(項(xiàng)目“Using millis() Function as an Alternative to Using delay()”

void loop() {
    ms_from_start = millis();
    if (ms_from_start-ms_previous_read_LED1>LED1_interval) {
        ms_previous_read_LED1 = ms_from_start;
        if (LED1_state == 0) LED1_state = 1;
        else LED1_state=0;
        digitalWrite(LED1,LED1_state);
    }
}

非阻塞 Arduino 程序的基本示例是朝著正確方向邁出的一步,因?yàn)榉亲枞a片段是可組合的。可組合意味著您可以在單個(gè) Arduino函數(shù)中將許多此類非阻塞代碼片段(無需修改)組合成代碼。loop()

但是這種方法的主要問題是隨著項(xiàng)目復(fù)雜性的增加,嵌套ifelse分支的數(shù)量迅速增加。這種架構(gòu)衰退也被稱為“意大利面條代碼”問題。

此外,簡(jiǎn)單的非阻塞程序沒有防止中斷和loop()函數(shù)之間共享的全局“輸入”損壞的保護(hù)措施。這會(huì)導(dǎo)致競(jìng)爭(zhēng)條件。

事件驅(qū)動(dòng)的 Arduino 編程

所有這些問題的長(zhǎng)期解決方案被稱為“事件驅(qū)動(dòng)編程” ,它具有以下特點(diǎn):

  • 程序內(nèi)的所有通信和同步都由專門為異步通信設(shè)計(jì)的特殊事件對(duì)象介導(dǎo)。
  • 事件驅(qū)動(dòng)程序自然分為實(shí)際處理事件的應(yīng)用程序和一般等待事件并將它們分派給應(yīng)用程序的監(jiān)督事件驅(qū)動(dòng)基礎(chǔ)設(shè)施(框架)。
  • 控制駐留在事件驅(qū)動(dòng)的基礎(chǔ)設(shè)施(框架)中,從應(yīng)用程序開發(fā)人員的角度來看,這會(huì)導(dǎo)致控制反轉(zhuǎn)。
  • 應(yīng)用程序代碼必須在不阻塞或輪詢的情況下處理事件直到完成(一次一個(gè)事件) 。

QP/C++ 框架提供了這樣一個(gè)事件驅(qū)動(dòng)的基礎(chǔ)架構(gòu),它專為深度嵌入式系統(tǒng)設(shè)計(jì),例如 Arduino 板。

QP/C++ 可以與各種實(shí)時(shí)內(nèi)核一起使用。在QP-Arduino集成中,QP/C++配置了最簡(jiǎn)單的協(xié)同QV調(diào)度器,軟件采用無限事件循環(huán)結(jié)構(gòu),如下圖所示:

pYYBAGNod3OAfmmpAACiwcvn3iE595.png
QP/C++框架內(nèi)協(xié)同QV調(diào)度器的結(jié)構(gòu)
?

QV 內(nèi)核設(shè)計(jì)中最重要的元素是存在多個(gè)具有唯一優(yōu)先級(jí)的事件隊(duì)列和分配給每個(gè)隊(duì)列的“活動(dòng)對(duì)象”。隊(duì)列由 QV 調(diào)度程序持續(xù)監(jiān)控,每次通過循環(huán)時(shí)都會(huì)選擇最高優(yōu)先級(jí)的非空隊(duì)列。調(diào)度器找到隊(duì)列后,從隊(duì)列中提取queue.get()事件(dispatch(e)

QV 內(nèi)核的另一個(gè)特點(diǎn)是它可以很容易地檢測(cè)到?jīng)]有可用事件的情況,在這種情況下系統(tǒng)可以進(jìn)入低功耗睡眠模式這使您可以實(shí)現(xiàn)更好的電源效率并將 Arduino 軟件應(yīng)用于低功耗、電池供電的應(yīng)用程序。(注意:真正的低功耗還需要適當(dāng)?shù)?a href='http://srfitnesspt.com/v/tag/1751/' target='_blank' class='arckwlink_none'>硬件設(shè)計(jì)。)

分層狀態(tài)機(jī)

除了為軟件組件(稱為“活動(dòng)對(duì)象”)的并發(fā)執(zhí)行提供事件驅(qū)動(dòng)的基礎(chǔ)設(shè)施外,QP/C++ 框架還提供了現(xiàn)代層次狀態(tài)機(jī),用于處理活動(dòng)對(duì)象內(nèi)的事件。使用狀態(tài)機(jī)的主要好處是避免了“意大利面條代碼”問題。

建模和自動(dòng)代碼生成

最后,QP/C++ 框架和高度結(jié)構(gòu)化的分層狀態(tài)機(jī)編碼方式為可視化建模和自動(dòng)代碼生成提供了基礎(chǔ)。QP-Arduino 集成包含免費(fèi)軟件QM 建模工具,它允許您以圖形方式設(shè)計(jì)活動(dòng)對(duì)象的分層狀態(tài)機(jī)。下面的屏幕截圖顯示了 QP-Arduino 與狀態(tài)機(jī)和代碼集成的示例模型。

poYBAGNod3eAImq1AAOavREBwqw286.png
帶有來自 QP-Arduino 集成的示例模型的免費(fèi)軟件 QM 工具的屏幕截圖。
?

。“超越 RTOS。

許可

QP-Arduino 集成中的 QP/C++ 框架在開源 GPLv3 許可下獲得許可,并帶有Arduino GPLv3 Exception

例外情況允許您將 QP/C++ 與任何Arduino 認(rèn)證板一起使用,而無需打開您的專有應(yīng)用程序代碼。

免費(fèi)軟件 QM 建模工具根據(jù)簡(jiǎn)單的 EULA獲得許可。

支持

您可以通過以下方式發(fā)布有關(guān) QP-Arduino 軟件的任何問題或意見:

  • 在 Arduino PROJECT HUB 上對(duì)該項(xiàng)目的評(píng)論

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)