程序执行过程分析 对于一般程序启动过程分析思路如下: 工程配置找到连接脚本-> 连接脚本找到复位向量-> 复位向量找到启动代码-> 运行环境代码分析-> 底层初始化代码分析 右键点击工程,点击properties ![]() 点击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类似,如果对这些比较熟悉的话很快就能入手,不熟悉的话由上面的分析过程也可以很快的入门。 |
2024 RISC-V 中国峰会:华秋电子助力RISC-V生态!
1021 浏览 0 评论
【昉·星光 2 高性能RISC-V单板计算机体验】移植IEC61850协议助力电子电子发展
985 浏览 0 评论
【昉·星光 2 高性能RISC-V单板计算机体验】在Docker 中运行 OpenWrt
2049 浏览 0 评论
【昉·星光 2 高性能RISC-V单板计算机体验】以容器的方式安装 HomeAssistant
2485 浏览 0 评论
【昉·星光 2 高性能RISC-V单板计算机试用体验】开箱及装载Debian系统
1967 浏览 2 评论