zephyr_02_内核启动

本文介绍了Zephyr轻量级Linux内核在Cortex-M4处理器上的启动流程,包括向量表、启动源文件、上电复位处理、_PrepC函数和_Cstart()内核初始化等步骤。详细解析了CPU上电复位操作,如中断表、栈空间初始化和数据拷贝,探讨了XIP和非XIP两种启动模式,并强调了在执行C代码前的环境准备。
摘要由CSDN通过智能技术生成

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  硬中断 
    .
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值