arduino基礎(chǔ)知識請見:
①: 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理論知識
一、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阱洪,一旦被加載芬迄,就會跳到main APP的入口
3问顷、執(zhí)行main APP,此時(shí)禀梳,第二個(gè)CPU和RTOS調(diào)度器都會運(yùn)行
入口調(diào)用 componments/esp32/cpu_start.c中的call_start_cpu0函數(shù)杜窄,
此函數(shù)會調(diào)用 call_start_cpu1.執(zhí)行后PRO CPU執(zhí)行start_cpu0,APP CPU執(zhí)行start_cpu1
最終會調(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:
三纱注、啟動流程
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)會默認(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庫中
有了以上知識后,我們看程序可以知道
app_main()調(diào)用了loopTask
loopTask會先調(diào)用setup函數(shù)逊移,再調(diào)用loop函數(shù)
loop函數(shù)會一直死循環(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è)核