今日Cortex-M3/M4研究总结
1.LR(R14)寄存器在函数调用的时候保存的是返回地址(BL指令会自动将返回地址保存在LR寄存器中),当中断发生的时候用于保存特殊信息:EXC_RETURN,它的具体定义为:
Bits [31:4] = 0xFFFFFFF // 标识为EXC_RETURN值
Bit 3 = SP选择 // 0=返回后使用MSP, 1=使用PSP
Bit 2 = 模式选择 // 0=返回Handler模式, 1=返回Thread模式
Bit 1 = 保留 // 必须为1(Thumb状态)
Bit 0 = 保留 // 必须为1简而言之就是此时LR寄存器用于指示中断执行完后该使用MSP还是PSP,该返回Handler模式还是Thread模式
2.当中断发生时为了保护现场(为了中断执行完后能跳回来),内核会自动将以下寄存器信息压栈:R0-R3,R12,LR,PC,PSR,其中PSR是最先入栈的(R0最后),保存R0-R3是因为程序里面会经常使用R0-R3来保存临时数据或作为中转;保存R12是因为:R12 寄存器(又称 IP,Intra-Procedure Call Register,过程调用内部寄存器),也算是半个特殊寄存器,经常作为函数调用中的临时中转寄存器以及被用于栈帧(Stack Frame)的临时计算;
3.系统复位后在Reset_Handler里面的详细执行流程:
void analyze_startup_sequence(void)
{/* * 复位后的时间线:* * t0: 上电复位 → Handler模式 (执行Reset_Handler)* - 异常号 = 1 (Reset)* - 使用MSP* - 特权级* * t1: C库初始化(__main) → 仍在Handler模式* - 初始化.data, .bss段* - 设置堆栈等* * t2: 调用main()前 → 切换到Thread模式* - C库执行 "BX LR" 或 "MSR CONTROL, ..."* - 切换到Thread模式 + MSP* * t3: 执行main() → Thread模式* - 现在运行在Thread模式* - 使用MSP (默认)* - 特权级 (默认)*/
}Reset_Handler:/* 初始化系统时钟、内存等 */bl SystemInit/* C库初始化 */bl __main/* __main函数会完成模式切换 *//* 这里不会执行到 */; __main在C库中完成的工作:
; 1. 复制.data段到RAM
; 2. 清零.bss段
; 3. 调用__rt_entry
; 4. __rt_entry最终调用main()前切换到Thread模式其中有明确说明__main函数的作用:复制.data段到RAM、清零.bss段 、调用__rt_entry并最终调用main且切换到Thread模式
