在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內(nèi)不再提示

淺析Zephyr在ESP32上的啟動流程

ZephyrProject ? 來源:開源中國 ? 作者:HalfCoder ? 2021-06-07 17:04 ? 次閱讀

理解Zephyr在一款soc上的啟動流程,有利于分析和調(diào)試開機(jī)過程卡死,驅(qū)動異常等的問題。因此在上手一款新的soc時掌握Zephyr在其上面的啟動流程非常必要。本文對Zephyr在ESP32上的啟動流程進(jìn)行分析,說明ESP32從上電開始如何執(zhí)行到Zephyr應(yīng)用的main函數(shù)。

Zephyr支持兩種ESP32引導(dǎo)方式:

配置CONFIG_BOOTLOADER_ESP_IDF=n:ROM Boot -》 Zephyr

配置CONFIG_BOOTLOADER_ESP_IDF=y. ROM Boot -》 ESP32 Bootloader -》 Zephyr

本文只分析CONFIG_BOOTLOADER_ESP_IDF=y的流程,在該流程理解另一種也類似,在CONFIG_BOOTLOADER_ESP_IDF=n的情況下相當(dāng)于是在ESP32的bootloader處放了一個zephyr應(yīng)用。

ESP32下Zephyr是被當(dāng)作ESP32的APP被引導(dǎo),因此有必要簡單了解ESP32的啟動流程

ESP32啟動階段

ESP32是雙核CPU,其中cpu0叫做PRO CPU, cpu1叫做APP CPU,啟動流程如下:

SOC上電, PRO CPU開始運行,跳到ROM 0x40000400 處復(fù)位向量代碼處執(zhí)行

在PRO CPU上運行ROM上一級引導(dǎo)代碼從Flash的0x1000讀出二級引導(dǎo)程序加載到內(nèi)部IRAM

跳轉(zhuǎn)到內(nèi)部IRAM上二級引導(dǎo)程序執(zhí)行

二級引導(dǎo)程序從 Flash 的 0x8000 偏移地址處讀取分區(qū)表, 從分區(qū)表中讀到APP的信息

二級引導(dǎo)程序?qū)ephyr數(shù)據(jù)和代碼段復(fù)制到DRAM和IRAM。對于Zephyr內(nèi)一些加載地址位于DROM和IROM區(qū)域的段,通過配置 Flash MMU 為其提供正確的映射。

二級引導(dǎo)程序會從Zephyr二進(jìn)制鏡像文件的頭部尋找的入口地址,然后跳轉(zhuǎn)到該地址處運行。

以上流程中1~3是已經(jīng)被固化到ESP32的ROM中無法修改,4~6是由modules/hal/espressif/components/bootloader完成,可以做定制修改,但一般不修改。以上1~6都是在PRO CPU中執(zhí)行。

Zephyr的入口地址就是函數(shù)__start,第六步后就會跳轉(zhuǎn)到__start中執(zhí)行

Zephyr階段

Zephyr階段運行到main主要步驟:__start-》z_cstart-》bg_thread_main-》main

__start

文件位置zephyr/soc/xtensa/esp32/soc.c, 主要完成下面內(nèi)容:

搬移中斷向量表

初始化bss段

關(guān)閉中斷

確保APP CPU沒有運行(將在后面SMP初始化階段打開)

代碼摘要如下

void __attribute__((section(“.iram1”))) \_\_start(void)

{

//搬移中斷向量表

__asm__ __volatile__ (

“wsr %0, vecbase”

: “r”(&_init_start));

//BSS段初始化

(void)memset(&_bss_start, 0,

(&_bss_end - &_bss_start) * sizeof(_bss_start));

__asm__ __volatile__ (

“”

: “g”(&_bss_start)

: “memory”);

//關(guān)閉中斷

__asm__ __volatile__ (

“wsr %0, PS”

: “r”(PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM | PS_WOE));

//關(guān)閉APP CPU

*app_cpu_config_reg &= ~DPORT_APPCPU_CLKGATE_EN;

//初始化cpu指針

__asm__ volatile(“wsr.MISC0 %0; rsync” : : “r”(&_kernel.cpus[0]));

//開始zephyr初始化

z_cstart();

CODE_UNREACHABLE;

}

是否發(fā)現(xiàn)跳到zephyr的__start是一個C函數(shù),但之前Zephyr并沒有做C堆棧(SP指針)初始化?這是因為在ESP32的bootloader階段已經(jīng)做了,Zephyr無需再做。

z_cstart

主要完成kernel初始化,PRE_KERNEL_1和PRE_KERNEL_2級別的驅(qū)動初始化,然后啟動main thread:bg_thread_main,剩下的其它初始化和應(yīng)用程序的main都在bg_thread_main中。

代碼摘要如下

__boot_func

FUNC_NORETURN void z_cstart(void)

{

//架構(gòu)相關(guān)的內(nèi)核初始化

arch_kernel_init();

// static devices初始化

z_device_state_init();

//初始化PRE_KERNEL_1和PRE_KERNEL_2驅(qū)動,大多都是硬件相關(guān)

z_sys_init_run_level(_SYS_INIT_LEVEL_PRE_KERNEL_1);

z_sys_init_run_level(_SYS_INIT_LEVEL_PRE_KERNEL_2);

//創(chuàng)建并切換到main thread運行

switch_to_main_thread(prepare_multithreading());

CODE_UNREACHABLE; /* LCOV_EXCL_LINE */

}

__boot_func

static char *prepare_multithreading(void)

{

char *stack_ptr;

//初始化OS調(diào)度器

z_sched_init();

//創(chuàng)建main thread

stack_ptr = z_setup_new_thread(&z_main_thread, z_main_stack,

CONFIG_MAIN_STACK_SIZE, bg_thread_main,

NULL, NULL, NULL,

CONFIG_MAIN_THREAD_PRIORITY,

K_ESSENTIAL, “main”);

//將main thread加入到就緒態(tài)

z_mark_thread_as_started(&z_main_thread);

z_ready_thread(&z_main_thread);

//為每顆CPU 創(chuàng)建idle thread

for (int i = 0; i 《 CONFIG_MP_NUM_CPUS; i++) {

init_idle_thread(i);

_kernel.cpus[i].idle_thread = &z_idle_threads[i];

_kernel.cpus[i].id = i;

_kernel.cpus[i].irq_stack =

(Z_KERNEL_STACK_BUFFER(z_interrupt_stacks[i]) +

K_KERNEL_STACK_SIZEOF(z_interrupt_stacks[i]));

}

initialize_timeouts();

return stack_ptr;

}

main thread被加入到就緒態(tài),因此下一次調(diào)度時bg_thread_main就會被執(zhí)行

bg_thread_main

在bg_thread_main中完成剩余的驅(qū)動初始化,并且啟動esp32的第二顆CPU: APP CPU, 然后運行到應(yīng)用的main函數(shù)。

代碼摘要如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

__boot_func

static void bg_thread_main(void *unused1, void *unused2, void *unused3)

{

z_sys_post_kernel = true;

//初始化POST_KERNEL級別驅(qū)動

z_sys_init_run_level(_SYS_INIT_LEVEL_POST_KERNEL);

boot_banner();

//初始化APPLICATION級別驅(qū)動

z_sys_init_run_level(_SYS_INIT_LEVEL_APPLICATION);

//初始化靜態(tài)聲明的thread

z_init_static_threads();

#ifdef CONFIG_SMP

//初始化SMP, 到這里才會啟動ESP32的另一顆CPU

z_smp_init();

//初始SMP級別的驅(qū)動,例如跨CPU通信的mailbox, ipm驅(qū)動

z_sys_init_run_level(_SYS_INIT_LEVEL_SMP);

#endif

extern void main(void);

//執(zhí)行應(yīng)用程序的main

main();

/* Mark nonessenrial since main() has no more work to do */

z_main_thread.base.user_options &= ~K_ESSENTIAL;

}

關(guān)于main

這里調(diào)用的main函數(shù),是在Zephyr應(yīng)用程序中實現(xiàn),最后通過鏈接器鏈接在一起。Zephyr應(yīng)用程序的main是在main thread中執(zhí)行,由于main thread的默認(rèn)優(yōu)先級比較高0, 因此要注意不要在main中去做while(1),避免導(dǎo)致其它搶占式線程拿不到CPU。

關(guān)于SMP

從前面的分析可以看到z_smp_init前,Zephyr上包括main thread的所有代碼都是在PRO CPU上執(zhí)行,在z_smp_init后Zephyr的代碼才有機(jī)會運行到APP CPU上, SMP是一個很大的議題,不是在本文分析范圍內(nèi)。這里簡單列出esp32 SMP初始化的主要流程供參考:

z_smp_init(smp.c)-》arch_start_cpu(esp32-mp.c)-》appcpu_start-》esp32_rom_ets_set_appcpu_boot_addr-》appcpu_entry1-》z_appcpu_stack_switch-》appcpu_entry2-》smp_init_top(smp.c)

參考

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-guides/startup.html

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11052

    瀏覽量

    216244
  • soc
    soc
    +關(guān)注

    關(guān)注

    38

    文章

    4357

    瀏覽量

    221953
  • SMP
    SMP
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    20192
  • ESP32
    +關(guān)注

    關(guān)注

    21

    文章

    1012

    瀏覽量

    18949

原文標(biāo)題:Zephyr ESP32啟動流程

文章出處:【微信號:ZephyrProject,微信公眾號:ZephyrProject】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    ESP32-S3開發(fā)板燒錄小智AI系統(tǒng)全流程指南

    AI語音交互領(lǐng)域不斷發(fā)展的今天,開發(fā)者們對于功能強(qiáng)大、開源靈活的開發(fā)板需求日益增長。今天,我們就來詳細(xì)了解一下ESP32AgentDevKit燒錄小智的全流程,這款搭載樂鑫科技ESP32
    的頭像 發(fā)表于 06-16 18:01 ?171次閱讀
    <b class='flag-5'>ESP32</b>-S3開發(fā)板燒錄小智AI系統(tǒng)全<b class='flag-5'>流程</b>指南

    ESP32運行網(wǎng)頁服務(wù)器 (Web-Server)-入門篇

    什么是ESP32WebServer?ESP32WebServer是ESP32微控制器運行的一個嵌入式網(wǎng)頁服務(wù)器。它能夠處理HTTP請求并
    的頭像 發(fā)表于 03-09 14:24 ?3687次閱讀
    <b class='flag-5'>ESP32</b>運行網(wǎng)頁服務(wù)器 (Web-Server)-入門篇

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本質(zhì)是讓 ESP32 設(shè)備與豆包的 API 進(jìn)行通信,以獲取相關(guān)服務(wù)
    的頭像 發(fā)表于 02-05 13:40 ?1781次閱讀
    <b class='flag-5'>esp32</b>如何接入豆包

    【AI技術(shù)支持】ESP32模組接大電容無法正常啟動處理

    啟明云端/01問題描述客戶工控產(chǎn)品使用樂鑫ESP32-WROOM-32E-N4模組,ESP-IDF版本為idf4.46時,項目應(yīng)用時掉
    的頭像 發(fā)表于 01-20 18:03 ?653次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32</b>模組接大電容無法正常<b class='flag-5'>啟動</b>處理

    【AI技術(shù)支持】ESP32-WROVER-IE-N16R8模組啟動失敗問題處理

    你是否曾遇到過?無線視頻監(jiān)控設(shè)備,使用ESP32-WROVER-IE-N16R8模組,ESP-IDF版本為idf5.0.1時,模組需與PHY芯片通信,主板
    的頭像 發(fā)表于 11-20 01:00 ?1364次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32</b>-WROVER-IE-N16R8模組<b class='flag-5'>上</b>電<b class='flag-5'>啟動</b>失敗問題處理

    【AI技術(shù)支持】ESP32模組PSRAM的CS引腳上拉導(dǎo)致功耗上升處理

    啟明云端/01你是否曾遇到過?游戲機(jī)產(chǎn)品,使用ESP32-WROOM-32E/ESP32-WROOM-32UE模組,ESP-IDF版本為
    的頭像 發(fā)表于 10-31 08:01 ?2056次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32</b>模組PSRAM的CS引腳上拉導(dǎo)致功耗上升處理

    esp32使用chatGPT做一些有意思的事情

    ChatGPT獲得響應(yīng),我們需要進(jìn)行以下步驟:1、OpenAI網(wǎng)站上注冊,并在ESP32安裝必要的庫。 2、OpenAI API創(chuàng)
    的頭像 發(fā)表于 10-18 10:04 ?1032次閱讀

    esp32esp8266代碼共用嗎

    本文將介紹ESP32ESP8266兩款流行的微控制器代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32
    的頭像 發(fā)表于 08-19 18:23 ?2239次閱讀

    esp8266和esp32區(qū)別是什么

    的內(nèi)存選項,包括最小512KB的RAM和最大16MB的閃存。 Wi-Fi和藍(lán)牙 : ESP8266 :支持2.4GHz Wi-Fi。 ESP32 :支持2.4GHz Wi-Fi和藍(lán)牙5.0,這使得ESP32
    的頭像 發(fā)表于 08-19 18:16 ?7042次閱讀

    esp32用什么軟件編程

    ESP32是一款由樂鑫(Espressif)推出的低功耗、高性能的Wi-Fi和藍(lán)牙雙模微控制器,廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、智能穿戴等領(lǐng)域。要對ESP32進(jìn)行編程,需要選擇合適的編程軟件和開發(fā)環(huán)境
    的頭像 發(fā)表于 08-19 17:24 ?6457次閱讀

    ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么區(qū)別?ESP32-WROOM-32 后綴字母代表的意思是?

    相信很多人心里都有這樣的疑問,今天就教大家怎么區(qū)分它們。 32D和32U是同一個芯片ESP32-D0WD的模組,主要區(qū)別的天線模式,分別是板載和IPEX外接天線。 32E是用的升級版的芯片
    的頭像 發(fā)表于 07-17 10:09 ?1.6w次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E、<b class='flag-5'>ESP32</b>-WROOM-32D、<b class='flag-5'>ESP32</b>-WROOM-32U  有什么區(qū)別?<b class='flag-5'>ESP32</b>-WROOM-32 后綴字母代表的意思是?

    ESP32能取代STM32嗎?哪個更好?

    不能!首先二者不存在哪個更好的問題,因為這兩個芯片使用場景各不相同,嵌入式系統(tǒng)領(lǐng)域,ESP32和STM32都是常見的單片機(jī)系列,它們各自具有一定的優(yōu)勢和適用場景。本文主要探討ESP32是否能夠取代
    的頭像 發(fā)表于 07-06 08:04 ?1.8w次閱讀
    <b class='flag-5'>ESP32</b>能取代STM32嗎?哪個更好?

    esp32s3的啟動時間遠(yuǎn)大于esp32,為什么?

    我自己畫了一塊esp32s3的開發(fā)板,使用esp32s3-wroom-1 n8r2的模組,最近測試時發(fā)現(xiàn),這個開發(fā)板幾乎沒有添加額外程序時啟動需要70ms,而
    發(fā)表于 07-01 06:25

    樂鑫esp32系列睡眠模式下保持藍(lán)牙連接的功耗測試

    本教程適用于ESP32-S3、ESP32-C3、ESP32-C6睡眠模式介紹ESP32系列常見的休眠方式有三種,分別為Modem-sleep、Light-sleep和Deep-slee
    的頭像 發(fā)表于 06-21 08:04 ?5308次閱讀
    樂鑫<b class='flag-5'>esp32</b>系列<b class='flag-5'>在</b>睡眠模式下保持藍(lán)牙連接的功耗測試

    ESP32里使用esp-idf框架該如何獲取系統(tǒng)電時間呢?

    ESP8266里面可以通過 esp_get_time()函數(shù) 獲取系統(tǒng)電時間, ESP32 里使用
    發(fā)表于 06-19 07:13
    主站蜘蛛池模板: 免费一区二区 | 成人网中文字幕色 | 亚洲人成综合网站在线 | 国产拍拍拍精品视频 | 1024国产基地永久免费 | 天堂中文在线观看 | 美女又黄又www | 国产性猛交xx乱 | 女女综合网 | 高h肉肉视频在线播放观看 高黄视频 | 亚洲精品久久久久影 | 免费高清视频免费观看 | 男女交性拍拍拍高清视频 | 123456成年免费视频 | 久草色香蕉 | a天堂在线观看 | 波多野结衣50连精喷在线 | 欧美一区福利 | 久久久伊香蕉网站 | 欧美日韩一区在线观看 | 国产大乳孕妇喷奶水在线观看 | 国产毛片久久国产 | 欧美性天天影院 | 亚洲欧美色鬼久久综合 | 国模娜娜扒开嫩木耳 | 人人搞人人爱 | 九色视频网 | 免费午夜视频 | 性色网址| 午夜亚洲福利 | 欧美性另类69xxx | 欧美激情 在线 | 久久夜色撩人精品国产 | 久久婷婷丁香七月色综合 | 天天射天天爱天天干 | 爱操成人网 | 久久99热不卡精品免费观看 | 亚洲综合亚洲综合网成人 | 午夜观看| 最新黄色大片 | 精品三级国产精品经典三 |