zephyr是一款轻量级的linux, 中文翻译为”和风, 西风, 轻薄织物”, 推出不到两年的时间, 已从刚开始支持的4,5个到现在支持市面上主流的MCU, 发展速度及其迅速, 最主要是开源, 现在更新到1.9.2, 基于最新版本代码, 汲取网上大牛们的经验, 对系统的启动流程做个简单的记录 (以cortex-cm4为例, 因手头的nrf52840是基于M4核的).
CPU上电复位操作流程
1. 查找向量中断表, 跳转到复位异常函数处理执行
2. 锁中断(NMI和hard Fault除外)
3. 初始化看门狗(条件编译, 可选)
4. 初始化中断栈空间(条件编译, 可选) // 但为什么要初始化为0xaa by Huihh 2017.12.8
5. 将PSP指向栈顶地址
6. 跳转到_PrepC函数, 准备C代码运行环境
7. 根据启动方式, 重定位向量表
8. 将BBS段清0
9. 数据拷贝, 从ROM拷贝到RAM中 (完成之后, C代码环境已准备好)
10. 初始化内核 (调用前必须确保系统已准备好执行C代码的环境, 处理器必须运行在32-bit模式, BSS段已清0)
1. 向量表
Cortex-M4的异常向量表
. 1-15 //系统异常向量表
. 16-255 //中断向量表, 芯片厂家一般只会实现其中一部分中断
2. 启动源文件(/${ZEPHYR_BASE}/arch/arm/core/cortex_m/vector_table.S)
#include <board.h>
#include <toolchain.h>
#include <linker/sections.h>
#include <drivers/system_timer.h>
#include "vector_table.h"
_ASM_FILE_PROLOGUE
GDATA(_main_stack) //_main_stack 全局符号, 存放在数据段
SECTION_SUBSEC_FUNC(exc_vector_table,_vector_table_section,_vector_table)
.word _main_stack + CONFIG_MAIN_STACK_SIZE //0 N/A
.word __reset //1 系统上电, 发生复位异常, 既会跳转到 __reset符号处执行
.word __nmi //2 不可屏蔽中断NMI,
.word __hard_fault //3 硬中断
.