RISC-V技术william hill官网
直播中

jf_1137202360

8年用户 1358经验值
擅长:嵌入式技术
私信 关注
[经验]

【芯昇科技RISC-V生态开发板试用体验】程序启动过程分析与仿真调试

程序执行过程分析
对于一般程序启动过程分析思路如下:
工程配置找到连接脚本->
连接脚本找到复位向量->
复位向量找到启动代码->
运行环境代码分析->
底层初始化代码分析
根据链接脚本查找程序入口
右键点击工程,点击properties
图片1.png
点击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下去找就可以,万变不离其宗,对于任何全新的开发环境都是一样的。
图片2.png
根据上述路径去左边资源管理器找到该文件打开
图片3.png
大致浏览下,使用的是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
图片4.png
既可以找到vtable处对应的代码CMIOT.CM32M4xxR_Library/SoC/CM32M4xxR/Common/NMSIS/Device/Source/GCC/startup_cm32m4xxr.S
图片5.png
可以看到该处的第一条代码就是 j _start,即跳到_start处运行
图片6.png
启动代码分析
继续搜索_start
看到代码如下:
图片7.png
可以看到调用过程如下
先设置了栈指针,中断控制器等,具体的可以对照这芯片的手册进行阅读。
然后调用了
SystemInit
搜索SystemInit可以看到代码位于
applicationApplicationSourcesystem_cm32m4xxr.c
可以看到默认主频配置为了SYSTEM_CORE_CLOCK 144MHz
后面进行了databss段的初始化等
然后后面是c++构造函数等的初始化
然后调用main
进入用户函数
通过上面可以进一步了解进入main函数之前到底干了什么,也对后面程序开发打下基础。
建议对于新的开发环境一定要有自己的独立分析过程。
使用仿真器跟踪执行过程
在之前找到的程序入口处双击添加断点如下
图片8.png
进入仿真环境
图片9.png
可以看到程序停止在了如下处
图片10.png
点击如下图标单步运行进入函数内部
图片11.png
点击如下图标 单步运行不进入函数内部
图片12.png
在关键位置比如call SystemInit处打断点
图片13.png
全速运行
图片14.png
运行到断点处
图片15.png
单步运行进入函数内部
图片16.png
其他仿真模式,比如查看变量 内存 寄存器等可以自己摸索或者查看帮助文档。
总结
不管从开发环境还是芯片执行过程而言,CORTEX-MMDK类似,如果对这些比较熟悉的话很快就能入手,不熟悉的话由上面的分析过程也可以很快的入门。

更多回帖

发帖
×
20
完善资料,
赚取积分