zehpyr启动流程
以下是 Zephyr 内核启动流程各阶段对应的关键代码位置(基于 Zephyr v3.5 为例),结合时序图中的阶段进行标注,方便定位源码:
1. Zephyr 启动流程各阶段代码位置
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 等)。
- RISC-V:
2.4. 设备模型初始化
- 核心入口:
device.c: device_manager_init()
- 作用:解析设备树,按优先级初始化所有设备驱动。
- 驱动初始化代码:各驱动的
init()
函数,如:- UART 驱动:
drivers/uart/uart_<芯片>.c
(如uart_stm32.c
)。 - SPI 驱动:
drivers/spi/spi_<芯片>.c
。
- UART 驱动:
- 优先级控制:通过设备树
status
和init-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 从硬件复位到应用运行的完整流程,便于调试和定制化开发(如修改初始化顺序、添加自定义硬件初始化逻辑)。