国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

淺析Zephyr在ESP32上的啟動流程

ZephyrProject ? 來源:開源中國 ? 作者:HalfCoder ? 2021-06-07 17:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

理解Zephyr在一款soc上的啟動流程,有利于分析和調試開機過程卡死,驅動異常等的問題。因此在上手一款新的soc時掌握Zephyr在其上面的啟動流程非常必要。本文對Zephyr在ESP32上的啟動流程進行分析,說明ESP32從上電開始如何執行到Zephyr應用的main函數。

Zephyr支持兩種ESP32引導方式:

配置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的情況下相當于是在ESP32的bootloader處放了一個zephyr應用。

ESP32下Zephyr是被當作ESP32的APP被引導,因此有必要簡單了解ESP32的啟動流程

ESP32啟動階段

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

SOC上電, PRO CPU開始運行,跳到ROM 0x40000400 處復位向量代碼處執行

在PRO CPU上運行ROM上一級引導代碼從Flash的0x1000讀出二級引導程序加載到內部IRAM

跳轉到內部IRAM上二級引導程序執行

二級引導程序從 Flash 的 0x8000 偏移地址處讀取分區表, 從分區表中讀到APP的信息

二級引導程序將Zephyr數據和代碼段復制到DRAM和IRAM。對于Zephyr內一些加載地址位于DROM和IROM區域的段,通過配置 Flash MMU 為其提供正確的映射。

二級引導程序會從Zephyr二進制鏡像文件的頭部尋找的入口地址,然后跳轉到該地址處運行。

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

Zephyr的入口地址就是函數__start,第六步后就會跳轉到__start中執行

Zephyr階段

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

__start

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

搬移中斷向量表

初始化bss段

關閉中斷

確保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”);

//關閉中斷

__asm__ __volatile__ (

“wsr %0, PS”

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

//關閉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;

}

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

z_cstart

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

代碼摘要如下

__boot_func

FUNC_NORETURN void z_cstart(void)

{

//架構相關的內核初始化

arch_kernel_init();

// static devices初始化

z_device_state_init();

//初始化PRE_KERNEL_1和PRE_KERNEL_2驅動,大多都是硬件相關

z_sys_init_run_level(_SYS_INIT_LEVEL_PRE_KERNEL_1);

z_sys_init_run_level(_SYS_INIT_LEVEL_PRE_KERNEL_2);

//創建并切換到main thread運行

switch_to_main_thread(prepare_multithreading());

CODE_UNREACHABLE; /* LCOV_EXCL_LINE */

}

__boot_func

static char *prepare_multithreading(void)

{

char *stack_ptr;

//初始化OS調度器

z_sched_init();

//創建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加入到就緒態

z_mark_thread_as_started(&z_main_thread);

z_ready_thread(&z_main_thread);

//為每顆CPU 創建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被加入到就緒態,因此下一次調度時bg_thread_main就會被執行

bg_thread_main

在bg_thread_main中完成剩余的驅動初始化,并且啟動esp32的第二顆CPU: APP CPU, 然后運行到應用的main函數。

代碼摘要如下

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級別驅動

z_sys_init_run_level(_SYS_INIT_LEVEL_POST_KERNEL);

boot_banner();

//初始化APPLICATION級別驅動

z_sys_init_run_level(_SYS_INIT_LEVEL_APPLICATION);

//初始化靜態聲明的thread

z_init_static_threads();

#ifdef CONFIG_SMP

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

z_smp_init();

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

z_sys_init_run_level(_SYS_INIT_LEVEL_SMP);

#endif

extern void main(void);

//執行應用程序的main

main();

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

z_main_thread.base.user_options &= ~K_ESSENTIAL;

}

關于main

這里調用的main函數,是在Zephyr應用程序中實現,最后通過鏈接器鏈接在一起。Zephyr應用程序的main是在main thread中執行,由于main thread的默認優先級比較高0, 因此要注意不要在main中去做while(1),避免導致其它搶占式線程拿不到CPU。

關于SMP

從前面的分析可以看到z_smp_init前,Zephyr上包括main thread的所有代碼都是在PRO CPU上執行,在z_smp_init后Zephyr的代碼才有機會運行到APP CPU上, SMP是一個很大的議題,不是在本文分析范圍內。這里簡單列出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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11277

    瀏覽量

    224952
  • soc
    soc
    +關注

    關注

    40

    文章

    4576

    瀏覽量

    229116
  • SMP
    SMP
    +關注

    關注

    0

    文章

    81

    瀏覽量

    20815
  • ESP32
    +關注

    關注

    26

    文章

    1194

    瀏覽量

    21677

原文標題:Zephyr ESP32啟動流程

文章出處:【微信號:ZephyrProject,微信公眾號:ZephyrProject】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    樂鑫科技發布全新ESP32-H21超低功耗無線SoC

    的升級版本,ESP32-H21 集成片 DC-DC 轉換器,可進一步降低芯片在工作狀態下的電流消耗,從而顯著延長對功耗敏感物聯網產品的電池使用時間。
    的頭像 發表于 03-05 14:24 ?1210次閱讀

    VisionFive 2 嘗試 Zephyr 時沒有輸出是怎么回事?

    我按照指示進行作官方文檔 VisionFive 2 測試 Zephyr hello_world demo,雖然我成功編譯了目標程序,但發送到 UART 后,我 tty
    發表于 02-05 06:49

    ESP32開發板創建同步WebServer網頁服務器

    ESP32 內置了 Wi-Fi 功能,能夠作為網頁服務器(Web Server)向網絡中的其他設備提供服務。通過 ESP32 運行網頁服務器,可以創建基于瀏覽器的用戶界面,用于監控
    的頭像 發表于 01-30 11:36 ?214次閱讀
    <b class='flag-5'>ESP32</b>開發板創建同步WebServer網頁服務器

    ESP32和STM32哪個更容易學?

    很多人會問,ESP32和STM32到底哪個更容易學?其實這個問題有點像問自行車和汽車哪個更好開——取決于你想去哪兒,以及你享受的是過程還是結果。 ESP32更像是一個為你搭好舞臺的智能硬件平臺
    的頭像 發表于 01-15 15:53 ?245次閱讀
    <b class='flag-5'>ESP32</b>和STM32哪個更容易學?

    無需安裝!瀏覽器里就能玩轉ESP32/ESP8266,這個神器絕了!

    無需安裝!瀏覽器里就能玩轉ESP32/ESP8266,這個神器絕了!【往期精選】十年嵌入式最深的痛,不是Bug,而是抓不到日志!vivo宣布原生支持HomeAssistant生態設備接入(含
    的頭像 發表于 01-10 10:01 ?826次閱讀
    無需安裝!<b class='flag-5'>在</b>瀏覽器里就能玩轉<b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266,這個神器絕了!

    ESP32 Wi-Fi 控制 LED 燈的原理

    智能家居、物聯網設備中,用手機通過Wi-Fi控制燈光、風扇或插座,已經非常普遍。而在嵌入式開發中,ESP32是最常用的Wi-Fi模塊之一。本文將帶你系統理解:ESP32是如何通過Wi-Fi實現遠程
    的頭像 發表于 01-09 19:04 ?292次閱讀
    <b class='flag-5'>ESP32</b> Wi-Fi 控制 LED 燈的原理

    ESP32藍牙驅動MAX98357對音頻音樂播放

    本文介紹了MAX98357音頻模塊的基本特性,并利用ESP32的藍牙功能程序驅動此模塊,最后用手機藍牙連接ESP32播放手機音樂
    的頭像 發表于 12-19 19:55 ?2644次閱讀
    <b class='flag-5'>ESP32</b>藍牙驅動MAX98357對音頻音樂播放

    ESP32-WROOM-32 技術規格書

    電子發燒友網站提供《ESP32-WROOM-32 技術規格書.pdf》資料免費下載
    發表于 11-11 17:27 ?0次下載

    樂鑫ESP32-C6和ESP32-C61究竟該如何選擇?一文讀懂本質區別

    樂鑫科技推出的ESP32-C6和ESP32-C61均支持Wi-Fi6,但定位不同。ESP32-C6是多協議樞紐,集成Wi-Fi6、藍牙5、Zigbee和Thread,適合智能家居網關和Matter
    的頭像 發表于 10-28 14:17 ?2033次閱讀
    樂鑫<b class='flag-5'>ESP32</b>-C6和<b class='flag-5'>ESP32</b>-C61究竟該如何選擇?一文讀懂本質區別

    ESP32開發板元件資料

    ESP32開發板元件
    發表于 07-21 14:47 ?15次下載

    ESP32-P4 C5開發板燒錄小智全流程!速看!

    沒錯,你沒有看錯!我們帶著WT99P4C5-S1開發板燒錄小智全流程走來了!開發板搭載樂鑫科技ESP32-P4和ESP32-C5芯片,代碼完全開源,支持靈活二次開發。什么?文字教程不好理解?別怕
    的頭像 發表于 07-04 18:03 ?2283次閱讀
    <b class='flag-5'>ESP32</b>-P4 C5開發板燒錄小智全<b class='flag-5'>流程</b>!速看!

    ESP32-S3開發板燒錄小智AI系統全流程指南

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

    ESP32-CAM帶OV2640攝像頭視頻顯示

    本文介紹了如何在Arduino IDE開發實現ESP32-CAM模塊獲取實時圖像視頻
    的頭像 發表于 05-23 10:47 ?1711次閱讀
    <b class='flag-5'>ESP32</b>-CAM帶OV2640攝像頭視頻顯示

    樂鑫ESP32-C5全面進入量產

    樂鑫信息科技 (688018.SH) 宣布,ESP32-C5 現已全面進入量產。
    的頭像 發表于 05-06 16:50 ?1386次閱讀

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

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