S32K328打断点调试进入main函数之前的准备工作
1:调试前的配置工作
代码工程使用S32DS创建的 freeRTOS例程,Startup_Code/路径下包含6个启动相关的文件
需要手动配置一下,将 “main” 修改为 “Reset_Handler”,默认程序是从main函数开始运行的;
我这里是使用jlink调试的,如果使用PE调试可能需要进行其它的设置;
如果遇到LOOP循环无法单步退出的话,直接在下一个函数处设置断点
2: 启动流程分析
指令标签名执行流程; Reset_Handler --> InitMSCMClock --> SetVTOR --> RamInit --> DTCM_Init --> ITCM_Init --> DebuggerHeldCoreLoop --> _DATA_INIT --> _INIT_DATA_BSS --> SET_VTOR_TCM --> __SYSTEM_INIT --> _MAIN
标签名及对应的作用,我这里写的比较简单;大家可以搜索具体标签名的作用
标签名 | 作用 | 备注 |
---|---|---|
Reset_Handler | 上电运行的第一个函数,初始化通用寄存器 | |
InitMSCMClock | 时钟初始化,只有主CPU需要初始化时钟 | |
SetVTOR | 设置中断向量表 | |
RamInit | RAM存储初始化 | |
DTCM_Init | DTCM存储初始化 | |
ITCM_Init | ITCM存储初始化 | |
DebuggerHeldCoreLoop | 调试器保持循环 | |
_DATA_INIT | 数据初始化; | bl Enable_FPU 注意上面这个指令需要F5执行到.c文件里面去, 按F6单步执行会跳转到main函数 |
_INIT_DATA_BSS | data段 初始化 | 带 bl 的指令,最好都F5跳转进去看 |
SET_VTOR_TCM | 设置默认的中断向量表;注意和SetVTOR中断向量表地址不一致 | |
__SYSTEM_INIT | 系统初始化,里面干的活还是挺多的 | |
_MAIN | 跳转到main函数了 |
从__MAIN 标签处跳转到main函数里面,开始支持用户代码了