我希望:從今天開始你可以徹底拋離裸奔的方式,不論你在開發(fā)多么復(fù)雜的軟件系統(tǒng)還是一個(gè)多么簡單的軟件應(yīng)用,不論你對(duì)RTOS有多么的陌生,哪怕只是聽說過從沒用過,不論你寫的代碼有多少坑,勇敢去嘗試,我相信他會(huì)給你打開一扇新的大門。從今天開始,我也在告誡自己再也不許回到那個(gè)裸奔時(shí)代,人可以走彎路,但不能走回頭路。
————程序小白,
======================萬事開頭皆例程========================
1. 選擇我們的例程,并且保存到本地。
2. ESP32是有兩個(gè)CPU組成的,你可以選擇任務(wù)運(yùn)行在哪個(gè)核心上:
3. 在setup中調(diào)用任務(wù)創(chuàng)建函數(shù)xTaskCreatePinnedToCore,創(chuàng)建任務(wù):
4. 創(chuàng)建任務(wù)以后,任務(wù)會(huì)自動(dòng)開始運(yùn)行,這個(gè)時(shí)候loop函數(shù)其實(shí)沒什么用了:
===============setup——loop機(jī)制的由來===================
你好不好奇setup——loop機(jī)制到底從何而來?
當(dāng)你新建一個(gè)工程的時(shí)候,你會(huì)發(fā)現(xiàn)自動(dòng)給到我們的就是setup和loop函數(shù):
接下來給出答案:
其實(shí)setup和loop本身就是在任務(wù)中被調(diào)用,而我們?cè)趌oopTask任務(wù)中創(chuàng)建了新的任務(wù),也就是程序開始執(zhí)行就跳入了一個(gè)任務(wù)中,后續(xù)所有的代碼運(yùn)行環(huán)境都是任務(wù)級(jí)。在我們的例程中實(shí)際的運(yùn)行是在三個(gè)任務(wù)之間不斷的切換。
細(xì)心的道友會(huì)發(fā)現(xiàn)在app_main()函數(shù)中調(diào)用的任務(wù)創(chuàng)建函數(shù) 和 我們?cè)谑纠姓{(diào)用的任務(wù)創(chuàng)建函數(shù)是不一樣的:
xTaskCreateUniversal 和 xTaskCreatePinnedToCore 到底有哪些區(qū)別。
xTaskCreate 和 xTaskCreatePinnedToCore 到底有哪些區(qū)別。
===============ESP32提供了freertos全套的接口文件==================
================freertos源文件以lib庫的形式提供===================
====================xTaskCreate 原型=======================
==================程序員眼中的xTaskCreate ====================
=================freertos眼中的xTaskCreate =====================
任務(wù)句柄:pvCreatedTask用于獲取任務(wù)狀態(tài)的控制塊,改變?nèi)蝿?wù)控制塊就可以控制任務(wù)的狀態(tài)轉(zhuǎn)換。
任務(wù)優(yōu)先級(jí):uxPriority ,一個(gè)應(yīng)用中永遠(yuǎn)都不止只有一個(gè)任務(wù)準(zhǔn)備就緒,等待獲取CPU資源,同時(shí)就緒的任務(wù),就需要任務(wù)優(yōu)先級(jí)進(jìn)行排隊(duì)處理。
任務(wù)棧:任務(wù)棧的目的時(shí)保存當(dāng)一個(gè)任務(wù)由運(yùn)行到中斷狀態(tài)切換時(shí),任務(wù)當(dāng)前執(zhí)行的上下文環(huán)境,等任務(wù)再次就緒后,執(zhí)行任務(wù)棧可以從任務(wù)中斷的位置繼續(xù)執(zhí)行該任務(wù)。
結(jié)論:引入了RTOS以后(其實(shí)不論他是不是free),實(shí)際可控的空間就越來越廣了,以前除了中斷,你無法打斷一個(gè)函數(shù)的執(zhí)行,哪怕應(yīng)用中斷任務(wù)化,你也無法將所有的任務(wù)全部放入中斷,中斷只是一個(gè)特殊的任務(wù)級(jí)切換應(yīng)用。它有助于你理解任務(wù)的切換,但他并不等同與任務(wù)。