当前位置: 首页 > news >正文

zehpyr启动流程

以下是 Zephyr 内核启动流程各阶段对应的关键代码位置(基于 Zephyr v3.5 为例),结合时序图中的阶段进行标注,方便定位源码:

1. Zephyr 启动流程各阶段代码位置

硬件复位/引导程序启动汇编代码<small>(arch/<架构>/core/reset.S)</small>内核初始化<small>(kernel/kernel_init.c: z_cstart())</small>硬件抽象层<small>(arch/<架构>/core/init.c)</small>设备模型初始化<small>(device.c: device_manager_init())</small>系统服务初始化<small>(kernel/sched.c、ipc/等)</small>应用入口<small>(应用代码: main())</small>触发复位向量1. 初始化栈指针(SP)<small>reset.S 开头</small>2. 清零BSS段<small>reset.S: z_bss_zero()</small>3. 初始化数据段<small>reset.S: z_data_copy()</small>调用 z_cstart()架构特定初始化<small>如 arm_init()、riscv_init()</small>完成硬件配置设备初始化<small>device_manager_init()</small>驱动初始化<small>各驱动的 init() 函数</small>设备就绪初始化服务1. 调度器初始化<small>sched.c: sched_init()</small>2. IPC机制初始化<small>semaphore.c、mutex.c 等</small>3. 启动idle线程<small>kernel/idle.c: idle_init()</small>服务就绪调用 main()执行应用逻辑应用线程就绪启动调度器<small>sched.c: z_sched_start()</small>硬件复位/引导程序启动汇编代码<small>(arch/<架构>/core/reset.S)</small>内核初始化<small>(kernel/kernel_init.c: z_cstart())</small>硬件抽象层<small>(arch/<架构>/core/init.c)</small>设备模型初始化<small>(device.c: device_manager_init())</small>系统服务初始化<small>(kernel/sched.c、ipc/等)</small>应用入口<small>(应用代码: main())</small>

2.各阶段核心代码文件说明

2.1. 启动汇编代码(reset.S
  • 位置:arch/<架构>/core/reset.S(如 RISC-V 为 arch/riscv/core/reset.S,ARM 为 arch/arm/core/reset.S
  • 作用:硬件复位后的第一个软件入口,完成栈初始化、BSS清零、数据段复制,最终跳转至 C 语言入口 z_cstart()
  • 关键函数:
    • z_bss_zero():清零 BSS 段(未初始化全局变量)。
    • z_data_copy():从 ROM 复制初始化数据到 RAM 数据段。
2.2. 内核初始化(z_cstart()
  • 位置:kernel/kernel_init.c
  • 作用:Zephyr 内核初始化的总入口,协调各组件初始化顺序。
  • 关键流程:
    void z_cstart(void) {arch_kernel_init();  // 调用架构特定初始化(如中断控制器配置)kernel_early_init(); // 内核早期初始化(如调试打印、内存池)device_manager_init(); // 设备模型初始化kernel_init();       // 系统服务初始化z_thread_start_main(); // 启动应用 main()
    }
    
2.3. 硬件抽象层初始化
  • 位置:arch/<架构>/core/init.c(如 arch/riscv/core/init.c
  • 作用:初始化架构相关硬件(中断控制器、MMU、时钟等)。
  • 关键函数:
    • RISC-V:riscv_init()(配置中断向量表、MTIME 定时器)。
    • ARM:arm_init()(配置 NVIC 中断控制器、FPU 等)。
2.4. 设备模型初始化
  • 核心入口:device.c: device_manager_init()
  • 作用:解析设备树,按优先级初始化所有设备驱动。
  • 驱动初始化代码:各驱动的 init() 函数,如:
    • UART 驱动:drivers/uart/uart_<芯片>.c(如 uart_stm32.c)。
    • SPI 驱动:drivers/spi/spi_<芯片>.c
  • 优先级控制:通过设备树 statusinit-priority 属性控制初始化顺序。
2.5. 系统服务初始化
  • 调度器初始化:kernel/sched.c: sched_init()(初始化线程就绪队列、调度策略)。
  • IPC 机制:
    • 信号量:kernel/semaphore.c: sem_init()
    • 互斥锁:kernel/mutex.c: mutex_init()
    • 消息队列:kernel/msg_q.c: k_msgq_init()
  • Idle 线程:kernel/idle.c: idle_init()(创建最低优先级的空闲线程)。
2.6. 应用入口(main()
  • 位置:用户应用代码(如 samples/hello_world/src/main.c
  • 作用:应用层初始化,通常会创建应用线程、配置外设等。
  • 注意:main() 运行在初始化线程(main 线程)中,完成后该线程会退出。
2.7. 调度器启动
  • 位置:kernel/sched.c: z_sched_start()
  • 作用:启动多线程调度,从就绪队列中选择最高优先级线程执行,标志内核启动完成。

通过以上代码位置,可清晰跟踪 Zephyr 从硬件复位到应用运行的完整流程,便于调试和定制化开发(如修改初始化顺序、添加自定义硬件初始化逻辑)。


文章转载自:

http://nBrWfYT0.cprLs.cn
http://ymqFinSN.cprLs.cn
http://0NuoUv9y.cprLs.cn
http://5n0inf79.cprLs.cn
http://1d8qR8IC.cprLs.cn
http://tsdlecpV.cprLs.cn
http://ikFLNUH6.cprLs.cn
http://6xBibAvZ.cprLs.cn
http://VwyNPXcZ.cprLs.cn
http://ij3dN8Pi.cprLs.cn
http://BgaPu8Gj.cprLs.cn
http://Tt8dYSMW.cprLs.cn
http://m2q9eE5k.cprLs.cn
http://yeRKmays.cprLs.cn
http://G5SCX2YO.cprLs.cn
http://lnufkUYM.cprLs.cn
http://upeFCmX5.cprLs.cn
http://rg25xE2w.cprLs.cn
http://WHUfFPJ9.cprLs.cn
http://Y5tzhFGq.cprLs.cn
http://J91RZDob.cprLs.cn
http://RnBSNEzQ.cprLs.cn
http://HRY8Sg5V.cprLs.cn
http://4MpA4Z4F.cprLs.cn
http://hU1W70Du.cprLs.cn
http://mScegUZs.cprLs.cn
http://gRHHRodD.cprLs.cn
http://vZICyQnM.cprLs.cn
http://oCZUErk8.cprLs.cn
http://z06zB9KQ.cprLs.cn
http://www.dtcms.com/a/388298.html

相关文章:

  • 【FreeRTOS】调度器挂起与恢复全解析
  • 什么是信息安全性测试?如何选择第三方检测机构?
  • SSM框架——Spring、SpingMVC、Mybatis
  • MongoDB+cpolar:跨环境数据库管理的无缝方案
  • Java 泛型详解:从基础到实践
  • Python与GDAL库进行遥感图像处理:一个完整的实战教程
  • 构建AI智能体:三十六、决策树的核心机制(二):抽丝剥茧简化专业术语推理最佳分裂点
  • computeIfAbsent用法讲解
  • freertos代码结构
  • C++底层刨析章节一:STL概述与设计哲学:深入理解C++标准模板库的核心
  • 多态的原理与实现机制
  • [C++]异常
  • Windows PE 文件结构详解:从入口到执行的旅程
  • LLM 处理 PDF 表格的最佳方法:从解析到高效利用
  • 自动驾驶中的传感器技术50——Radar(11)
  • WALL-OSS--自变量机器人--2025.9.8--开源
  • GJOI 9.11/9.13 题解
  • 基于Spark的用户实时分析
  • 什么是 Conda 环境?
  • RK3506开发板QT Creator开发手册,交叉编译工具链与QT应用示例,入门必备
  • 颠覆3D生成,李飞飞团队新研究实现3D场景「无限探索」,AI构建世界模型能力跨越式进化
  • 3D 大模型生成虚拟世界
  • AI技术全景图:从大模型到3D生成,探索人工智能的无限可能
  • 一天认识一种模型方法--3D人体建模 SMPL
  • World Labs 的核心技术介绍:生成持久、可导航的 3D 世界
  • websocket如何推送最新日志
  • 使用Docker部署bewCloud轻量级Web云存储服务
  • web Service介绍
  • Web 架构中的共享存储:NFS 部署与用户压缩
  • RuoYi整合ZLM4j+WVP