ARM Cortex-M 复位与取指流程浅析——学习笔记
本文为个人关于 ARM Cortex-M 内核复位与取指流程的学习笔记,基于公开的 ARM 架构参考手册及通用计算机组成原理知识整理,欢迎大家讨论并指出问题。
复位分为全局复位,系统复位,软件复位,局部复位,以下为简约版阐述以及个别例子。
全局复位所有的SRAM清零,BIST也要启动,即芯片自测,系统低功耗复位不需要自检,SRAM清零。
进行全局复位(冷启动)之后,首先物理层苏醒,即电压电流(PMU与POR)起来,接下来是时钟与锁相环(晶振与PLL),心跳起来,锁相环得锁住,在电压电流还未到额定值时,直接进行下一步时,极有可能处于0与1的摇摆状态,不太稳定,等时钟与锁相环稳定后,下一步进入BIST自检状态,自检完成后若芯片有安全校验需求,则进入HSM进行校验,通过后加载向量表,PC开始取值,时钟寄存器开始初始化,初始化完成后进入main函数,程序运行。
系统复位,这个有些UNIT不需要重置,目的是为了看程序在哪里跑飞了,可能是看门狗或者其他的,起到一个查看日志的作用。
软件复位在硬件层面是不需要重置太多,目的是不需要让芯片再次进行冷启动循环,不需要物理断电即可保存故障状态。
局部复位针对于一些小模块,比如CAN出现了问题,不需要消耗其他时间重启,针对于个别模块进行处理。
在内核退出复位状态之后,CPU通过PC指针(即程序计数器,R15寄存器)向I-CODE总线发起请求,从内存中(Flash/ROM/RAM等)获取16位或32位机器码,机器码进入译码器后解析出对应的指令操作码和指令操作数,若为运算则在CPU中进行,若是存读数据,则是LDR和STR通过总线读取或写到Flash或者SRAM,结束对应的操作后,PC根据指令长度,若是16位长度则PC+2,若是32位长度则PC+4指向下一条取值地址。
芯片中的操作皆是由硬件自行处理,这里的汇编是用汇编语句对操作进行的描述,其他语言同理。