arduino基礎(chǔ)知識(shí)請(qǐng)見:
①: https://blog.csdn.net/dpjcn1990/article/details/92831300
②: https://blog.csdn.net/dpjcn1990/article/details/92831334
③: https://blog.csdn.net/dpjcn1990/article/details/92831364
ESP32及arduino理論知識(shí)
一、ESP32,是如何運(yùn)行RTOS的?
參考文檔 general-notes.rst
1、 第一階段bootloader(ROM中)加載第二階段bootloader(位于FLASH 0X1000)
2、 第二階段的boot loader加載分區(qū)表和MAIN APP應(yīng)用程序(其實(shí)就是freertos了)
main APP包含RAM段和Flash段
① 去0X8000加載分區(qū)表 ,配置兩個(gè)CPU(PRO CPU和APP CPU)的MMU,但只使能PRO cpu的flash,一旦被加載,就會(huì)跳到main APP的入口
3、執(zhí)行main APP,此時(shí),第二個(gè)CPU和RTOS調(diào)度器都會(huì)運(yùn)行
入口調(diào)用 componments/esp32/cpu_start.c中的call_start_cpu0函數(shù),
此函數(shù)會(huì)調(diào)用 call_start_cpu1.執(zhí)行后PRO CPU執(zhí)行start_cpu0,APP CPU執(zhí)行start_cpu1
最終會(huì)調(diào)用app_main函數(shù)
二、內(nèi)存分布
內(nèi)存分為:
1、IRAM:
Internal SRAM0
ISR。Handlers 中斷處理函數(shù)必須放到IRAM里 (方法:通過家IRAM——ATTR屬性就能把代碼或變量放入IRAM里)
一些時(shí)序比較高的也應(yīng)該放入IRAM里
2、IROM:
3、DRAM:
4、DROM:
三、啟動(dòng)流程
1、地址映射

①、首先在0XE000下載了:bootapp0

②、其次在0X1000下載了:bootloader

等待下載完成,后繼續(xù)進(jìn)程如下:

③、在0X10000下載了:應(yīng)用程序(RTOS)

④、在0X8000下載了:分區(qū)表 default

這個(gè)文件是由default.csv表格生成的,打開表格可以發(fā)現(xiàn)分區(qū)和地址的關(guān)系。

知道了分區(qū)表其實(shí)我們也可以借助別的工具下載程序了,例如

四、setup()和loop()函數(shù)
首先,我們要知道系統(tǒng)會(huì)默認(rèn)編譯cores文件夾下的內(nèi)容(相當(dāng)于系統(tǒng)自帶的庫函數(shù))

其次,我們要知道 PRO CPU在運(yùn)行應(yīng)用程序之前先運(yùn)行了app_main函數(shù),
其實(shí)這個(gè)函數(shù)就在cores文件夾下的main.cpp里面


再次,我們要知道,除了cores和librarise下的文件,其他文件都被放入.a庫文件中 lib庫中

有了以上知識(shí)后,我們看程序可以知道

app_main()調(diào)用了loopTask

loopTask會(huì)先調(diào)用setup函數(shù),再調(diào)用loop函數(shù)
loop函數(shù)會(huì)一直死循環(huán),所以我們可以在setup里創(chuàng)建任務(wù),
五、如何在第二個(gè)核上創(chuàng)建任務(wù)
使用xTaskCreatePinnedToCore(loopTask, "loopTask", 8192, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
最后一個(gè)參數(shù)里 傳0代表第一個(gè)核,1代表第二個(gè)核