参考文档地址:
https://www.cnblogs.com/strongwong/p/8657639.html
关于nrf52832上电启动分析:
启动所需要做的事:
堆栈的初始化、初始化中断向量表、在进入main之前初始化时钟
启动过程中用的.s文件
arm_startup_nrf52.s
定义堆栈,堆栈的数据都时在RAW中
然后定义RESET区域
然后是定位中断向量表:
第一条指令对应的堆栈,从第二条指令开始进入Reset Handler
在Reset_Handler中会先经SystemInit函数导入,可以理解成初始化时钟
对于SystemInit的理解:为啥需要在main之前初始化时钟,以前看过最标准的理解是,CPU启动工作的这段时间,内存、外设等设备还没有启动,需要CPU分配时钟来启动外设,然后分配堆栈空间,并且将存在到flash的数据copy到RAW然后在跳入到main中。
仔细观察SystemInit函数,发现没有变量,操作的都是寄存器,个人理解,局部变量就需要分配堆栈地址,而堆栈又是在内存,无法实现。
之后在初始化库函数,然后最终进入main函数
然后是具体的分析.hex文件
.hex文件和.s文件是一一对应
从图中可以看到0x00000000的位置是RAW的0x2002080也就数栈的位置
函数地址
Reset_Handler 0x00000004
NMI_Handler 0x00000008
.........
和向量表中的位置是一一对应