今日Cortex-M3/M4研究总结

今日Cortex-M3/M4研究总结 1.关于LRLR(R14)寄存器在函数调用的时候保存的是返回地址BL指令会自动将返回地址保存在LR寄存器中当中断发生的时候用于保存特殊信息EXC_RETURN它的具体定义为Bits [31:4] 0xFFFFFFF // 标识为EXC_RETURN值 Bit 3 模式选择 // 0返回Handler模式, 1返回Thread模式 Bit 2 SP选择 // 0返回后使用MSP, 1使用PSP Bit 1 保留 // 必须为1Thumb状态 Bit 0 保留 // 必须为1简而言之就是此时LR寄存器用于指示中断执行完后该使用MSP还是PSP该返回Handler模式还是Thread模式2.关于中断入栈当中断发生时为了保护现场为了中断执行完后能跳回来内核会自动将以下寄存器信息压栈R0-R3,R12,LR,PC,PSR其中PSR是最先入栈的(R0最后)保存R0-R3是因为程序里面会经常使用R0-R3来保存临时数据或作为中转保存R12是因为R12 寄存器又称 IPIntra-Procedure Call Register过程调用内部寄存器也算是半个特殊寄存器经常作为函数调用中的临时中转寄存器以及被用于栈帧Stack Frame的临时计算3.Reset_Handler的详细执行内容和流程系统复位后在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模式4.中断分类CM3/CM4将所有异常分为系统异常和外部中断两种系统异常中Reset、NMI和HardFault是固定优先级的其他异常的优先级是可配置的系统异常的优先级和外部中断的优先级一样共享分组并不是系统异常的优先级就一定高于外部中断系统异常的优先级设置寄存器为SCB-SHP[x]外部中断为NVIC-IP[x]。