資料介紹
傳統(tǒng)的順序 Arduino 編程
傳統(tǒng)的 Arduino 編程模型被稱(chēng)為“順序編程” ,因?yàn)轭A(yù)期的事件序列通常硬編碼在阻塞調(diào)用序列中,這些阻塞調(diào)用排隊(duì)等待預(yù)期事件的到達(dá)。
例如,在標(biāo)準(zhǔn)的 Arduino Blink 示例中,您期望通過(guò)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)單的問(wèn)題,但對(duì)于更復(fù)雜的項(xiàng)目來(lái)說(shuō)擴(kuò)展性很差并且很快變得不可行,在這些項(xiàng)目中你需要同時(shí)做很多事情,例如以不同的速率閃爍第二個(gè) LED。
根本問(wèn)題是,當(dāng)一個(gè)順序程序在等待一種事件(例如,時(shí)間延遲)時(shí),它不做任何其他工作,也不響應(yīng)其他事件(例如,不同的時(shí)間延遲或按鈕按下) .
Arduino編程無(wú)阻塞
由于這些原因,更有經(jīng)驗(yàn)的 Arduino 程序避免阻塞(或輪詢(xún))并在線等待事件,例如dealy()函數(shù)。相反,程序僅檢查感興趣的條件(使用顯式if()語(yǔ)句)并僅在檢測(cè)到事件時(shí)處理事件。在任何情況下,Arduinoloop()函數(shù)總是快速返回,這使得程序能夠響應(yīng)其他事件。
這種方法的示例包括使用 Arduinomillis()函數(shù)(例如,參見(jiàn)Arduino 項(xiàng)目“使用 millis() 函數(shù)作為使用 delay() 的替代方法” )。
清單 2:無(wú)阻塞的 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ù)中將許多此類(lèi)非阻塞代碼片段(無(wú)需修改)組合成代碼。loop()
但是這種方法的主要問(wèn)題是隨著項(xiàng)目復(fù)雜性的增加,嵌套if和else分支的數(shù)量迅速增加。這種架構(gòu)衰退也被稱(chēng)為“意大利面條代碼”問(wèn)題。
此外,簡(jiǎn)單的非阻塞程序沒(méi)有防止中斷和loop()函數(shù)之間共享的全局“輸入”損壞的保護(hù)措施。這會(huì)導(dǎo)致競(jìng)爭(zhēng)條件。
事件驅(qū)動(dòng)的 Arduino 編程
所有這些問(wèn)題的長(zhǎng)期解決方案被稱(chēng)為“事件驅(qū)動(dòng)編程” ,它具有以下特點(diǎn):
- 程序內(nèi)的所有通信和同步都由專(zhuān)門(mén)為異步通信設(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)用程序開(kāi)發(fā)人員的角度來(lái)看,這會(huì)導(dǎo)致控制反轉(zhuǎn)。
- 應(yīng)用程序代碼必須在不阻塞或輪詢(xún)的情況下處理事件直到完成(一次一個(gè)事件) 。
QP/C++ 框架提供了這樣一個(gè)事件驅(qū)動(dòng)的基礎(chǔ)架構(gòu),它專(zhuān)為深度嵌入式系統(tǒng)設(shè)計(jì),例如 Arduino 板。
QP/C++ 可以與各種實(shí)時(shí)內(nèi)核一起使用。在QP-Arduino集成中,QP/C++配置了最簡(jiǎn)單的協(xié)同QV調(diào)度器,軟件采用無(wú)限事件循環(huán)結(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)控,每次通過(guò)循環(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ù)挠布O(shè)計(jì)。)
分層狀態(tài)機(jī)
除了為軟件組件(稱(chēng)為“活動(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ī)的主要好處是避免了“意大利面條代碼”問(wèn)題。
建模和自動(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ī)和代碼集成的示例模型。

。“超越 RTOS”。
許可
QP-Arduino 集成中的 QP/C++ 框架在開(kāi)源 GPLv3 許可下獲得許可,并帶有Arduino GPLv3 Exception。
例外情況允許您將 QP/C++ 與任何Arduino 認(rèn)證板一起使用,而無(wú)需打開(kāi)您的專(zhuān)有應(yīng)用程序代碼。
免費(fèi)軟件 QM 建模工具根據(jù)簡(jiǎn)單的 EULA獲得許可。
支持
您可以通過(guò)以下方式發(fā)布有關(guān) QP-Arduino 軟件的任何問(wèn)題或意見(jiàn):
- 在 Arduino PROJECT HUB 上對(duì)該項(xiàng)目的評(píng)論
- 發(fā)布到免費(fèi) QP/QM 支持論壇
- 在 GitHub qp-arduino 存儲(chǔ)庫(kù)上發(fā)布問(wèn)題
- 在QP-Arduino 項(xiàng)目網(wǎng)頁(yè)上發(fā)表評(píng)論
- labview狀態(tài)機(jī)分享 15次下載
- LABVIEW的狀態(tài)機(jī)實(shí)現(xiàn)資料合集 47次下載
- 狀態(tài)模式(狀態(tài)機(jī))
- 利用狀態(tài)機(jī)實(shí)現(xiàn)對(duì)tlc5620dac控制.
- 基于狀態(tài)機(jī)的汽車(chē)電動(dòng)滑移門(mén)系統(tǒng) 8次下載
- 基于Moore型狀態(tài)機(jī)的交通燈控制系統(tǒng) 35次下載
- 使用Synplify設(shè)計(jì)安全的VHDL狀態(tài)機(jī) 12次下載
- 使用獨(dú)立于內(nèi)核的外設(shè)構(gòu)建硬件狀態(tài)機(jī) 7次下載
- 如何使用FPGA實(shí)現(xiàn)序列檢測(cè)有限狀態(tài)機(jī) 12次下載
- 基于有限狀態(tài)機(jī)的工控系統(tǒng)軟件設(shè)計(jì) 3次下載
- 狀態(tài)機(jī)原理及用法 0次下載
- 狀態(tài)機(jī)代碼生成工具 9次下載
- 基于有限狀態(tài)機(jī)的工控系統(tǒng)軟件設(shè)計(jì)
- 如何寫(xiě)好狀態(tài)機(jī)
- 狀態(tài)機(jī)實(shí)例(VHDL源代碼)
- 狀態(tài)機(jī)該怎么監(jiān)控 439次閱讀
- Spring狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法 2172次閱讀
- SaberRD狀態(tài)機(jī)建模工具介紹(一)什么是狀態(tài)機(jī)建模 1778次閱讀
- 狀態(tài)機(jī)怎么上來(lái)就錯(cuò)了?怎么解決? 395次閱讀
- 什么是狀態(tài)機(jī)?狀態(tài)機(jī)的種類(lèi)與實(shí)現(xiàn) 9883次閱讀
- 基于事件驅(qū)動(dòng)的有限狀態(tài)機(jī)介紹 1067次閱讀
- 嵌入式中狀態(tài)機(jī)的設(shè)置 1119次閱讀
- 如何構(gòu)建基于狀態(tài)機(jī)的軟件系統(tǒng) 1567次閱讀
- 狀態(tài)機(jī)到底是什么 3814次閱讀
- 狀態(tài)機(jī)概述 如何理解狀態(tài)機(jī) 1w次閱讀
- 狀態(tài)機(jī)和組合邏輯的冒險(xiǎn)競(jìng)爭(zhēng)淺析 3995次閱讀
- 利用74LS161實(shí)現(xiàn)復(fù)雜狀態(tài)機(jī) 9987次閱讀
- 初學(xué)者對(duì)有限狀態(tài)機(jī)(FSM)的設(shè)計(jì)的認(rèn)識(shí) 4342次閱讀
- 利用狀態(tài)機(jī)的狀態(tài)機(jī)實(shí)現(xiàn)層次結(jié)構(gòu)化設(shè)計(jì) 3337次閱讀
- 使用ModelSim自動(dòng)生成狀態(tài)機(jī)FSM的狀態(tài)轉(zhuǎn)換圖 1.5w次閱讀
下載排行
本周
- 1NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
- 2智慧監(jiān)獄建設(shè)的核心終端—智慧監(jiān)倉(cāng)屏
- 0.25 MB | 2次下載 | 免費(fèi)
- 3PC318C016M/D 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.77 MB | 2次下載 | 免費(fèi)
- 45.0SMDJ200A單向TVS瞬態(tài)抑制二極管規(guī)格書(shū)
- 0.88 MB | 1次下載 | 免費(fèi)
- 5PC318C041EQ 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.50 MB | 次下載 | 免費(fèi)
- 6PC318C042NM 200V半橋柵極驅(qū)動(dòng)器技術(shù)手冊(cè)
- 0.55 MB | 次下載 | 免費(fèi)
- 7技嘉H110主板IT8628E_BX IO電路圖資料
- 2.61 MB | 次下載 | 1 積分
- 8H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
- 0.63 MB | 次下載 | 1 積分
本月
- 1元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 241次下載 | 免費(fèi)
- 2元宇宙底層硬件系列報(bào)告
- 13.42 MB | 184次下載 | 免費(fèi)
- 32022 年展望報(bào)告 – 半導(dǎo)體產(chǎn)業(yè)
- 1.43 MB | 136次下載 | 免費(fèi)
- 4晶振與濾波器應(yīng)用電路《電子工程師必備:元器件應(yīng)用寶典》
- 1.57 MB | 90次下載 | 免費(fèi)
- 5汽車(chē)電子行業(yè)深度解析:智能化與電動(dòng)化方興未艾
- 6.47 MB | 71次下載 | 免費(fèi)
- 6中國(guó)DPU行業(yè)白皮書(shū)
- 23.80 MB | 37次下載 | 免費(fèi)
- 7晶科鑫代理線-微盟電子2021年度產(chǎn)品目錄選型手冊(cè)
- 14.75 MB | 27次下載 | 免費(fèi)
- 8NB-IoT芯片廠商的資料說(shuō)明
- 0.31 MB | 22次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191425次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183352次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App






創(chuàng)作
發(fā)文章
發(fā)帖
提問(wèn)
發(fā)資料
發(fā)視頻
上傳資料賺積分
評(píng)論