程序执行过程分析对于一般程序启动过程分析思路如下:
工程配置找到连接脚本->
连接脚本找到复位向量->
复位向量找到启动代码->
运行环境代码分析->
底层初始化代码分析
根据链接脚本查找程序入口点击C/C++ Build选项卡,点击Settings
右边选择GNU RISC-V Cross C++ Linker
点击General可以看到右边连接脚本为
CMIOT.CM32M4xxR_Library/SoC/CM32M4xxR/Common/NMSIS/Device/Source/GCC/gcc_cm32m4xxr_flashxip.ld
注:因为链接脚本实际是链接时使用,所以去Linker下去找就可以,万变不离其宗,对于任何全新的开发环境都是一样的。
根据上述路径去左边资源管理器找到该文件打开
大致浏览下,使用的是gnu工具链,所以链接脚本使用的也是ld文件,可以大致看下,不熟悉其语法的可以网上搜索相关信息。
可以看到
定义了FLASH段
__FLASH_BASE = 0x08000000;
__FLASH_SIZE = 0x00080000; /* 512K user flash */
MEMORY
{
flash (rxai!w) : ORIGIN = __FLASH_BASE, LENGTH = __FLASH_SIZE
ram (wxa!ri) : ORIGIN = __RAM_BASE, LENGTH = __RAM_SIZE
}
/* Define entry label of program */
ENTRY(_start)
SECTIONS
{
__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2K;
.init :
{
/* vector table locate at flash */
*(.vtable)
KEEP (*(SORT_NONE(.init)))
} >flash AT>flash
vtable段即放在了FLASH的开头,而根据芯片手册描述,芯片重启就是从该定义的FLASH开始处运行的。
所以我们搜索vtable
既可以找到vtable处对应的代码CMIOT.CM32M4xxR_Library/SoC/CM32M4xxR/Common/NMSIS/Device/Source/GCC/startup_cm32m4xxr.S
可以看到该处的第一条代码就是 j _start,即跳到_start处运行
启动代码分析继续搜索_start
看到代码如下:
可以看到调用过程如下
先设置了栈指针,中断控制器等,具体的可以对照这芯片的手册进行阅读。
然后调用了
SystemInit
搜索SystemInit可以看到代码位于
applicationApplicationSourcesystem_cm32m4xxr.c
可以看到默认主频配置为了SYSTEM_CORE_CLOCK 144MHz
后面进行了data段 bss段的初始化等
然后后面是c++构造函数等的初始化
然后调用main
进入用户函数
通过上面可以进一步了解进入main函数之前到底干了什么,也对后面程序开发打下基础。
建议对于新的开发环境一定要有自己的独立分析过程。
使用仿真器跟踪执行过程在之前找到的程序入口处双击添加断点如下
进入仿真环境
可以看到程序停止在了如下处
点击如下图标单步运行进入函数内部
点击如下图标 单步运行不进入函数内部
在关键位置比如call SystemInit处打断点
全速运行
运行到断点处
单步运行进入函数内部
其他仿真模式,比如查看变量 内存 寄存器等可以自己摸索或者查看帮助文档。
总结不管从开发环境还是芯片执行过程而言,与CORTEX-M与MDK类似,如果对这些比较熟悉的话很快就能入手,不熟悉的话由上面的分析过程也可以很快的入门。