当前位置: 首页 > news >正文

【GD32】启动过程-程序计数器(PC)

GD32启动文件中的Reset_Handler是芯片上电或复位后执行的第一个C语言环境初始化程序,其核心作用是为运行main函数做好准备。下面我们通过一个表格来概览其主要步骤,然后深入解析关键的汇编实现细节。

步骤核心操作功能说明
1. 初始化栈指针 (MSP)MRS R0, MSP (视情况)设置主堆栈指针,为后续函数调用提供栈空间。
2. 调用SystemInitLDR R0, =SystemInit BLX R0跳转到C函数,配置系统关键时钟(如PLL、SYSCLK)。
3. 跳转至__mainLDR R0, =__main BX R0进入C库函数,完成数据段初始化、BSS段清零等。

🔍 关键汇编指令详解

在典型的GD32启动文件(如startup_gd32f30x.s或类似)中,Reset_Handler的汇编实现通常如下所示(不同型号或固件库版本可能略有差异):

Reset_Handler   PROC                 ; 开始一个子程序EXPORT  Reset_Handler [WEAK]  ; 声明为全局符号,[WEAK]允许被用户自定义同名函数覆盖IMPORT  SystemInit             ; 声明外部符号SystemInit,告知链接器该符号在外部定义IMPORT  __main                 ; 声明外部符号__mainLDR     R0, =SystemInit        ; 将SystemInit函数的地址加载到寄存器R0BLX     R0                     ; 跳转到R0指定的地址(执行SystemInit),并保存返回地址LDR     R0, =__main            ; 将__main的地址加载到寄存器R0BX      R0                     ; 跳转到R0指定的地址(执行__main),不返回ENDP                           ; 结束子程序

这段代码中关键的汇编指令含义如下:

  • PROC/ENDP:用于定义子程序的开始和结束。
  • EXPORT [WEAK]:将Reset_Handler导出为全局符号,[WEAK]弱定义意味着如果用户在别处定义了同名的Reset_Handler函数,链接器将优先使用用户定义的版本。
  • IMPORT:通知汇编器SystemInit__main是在其他文件中定义的符号,需要在链接时解析。
  • LDR R0, =label:一个伪指令,将标签label的地址加载到寄存器R0中。
  • BLX R0:带链接(返回地址存入LR寄存器)且切换指令集的跳转。跳转到R0中的地址执行SystemInit函数,执行完毕后会返回到下一条指令。
  • BX R0:跳转到R0中的地址执行__main,不再返回。因为__main会最终调用用户的main函数,而整个嵌入式应用程序在main函数中通常是一个无限循环,不会退出。

⚙️ 核心操作解析

  1. 系统初始化 (SystemInit):这是一个非常重要的C语言函数,通常由芯片厂商提供。它负责配置GD32的时钟系统,例如使能内部或外部高速时钟(HSI/HSE)、配置锁相环(PLL)以提升系统时钟频率,以及设置AHB、APB总线分频器等。这是确保芯片能以正确且期望的速度运行的关键一步。
  2. C环境初始化 (__main)__main是由C库提供的入口点,它并非用户的main函数。它的工作包括:
    • 数据段 (.data) 初始化:将已初始化全局变量和静态变量的初始值从Flash存储器(只读)复制到RAM中(可读写)的对应位置。
    • BSS段 (.bss) 清零:将未初始化的全局变量和静态变量所在的内存区域清零。
    • 完成这些初始化后,最终调用用户的main()函数。

💎 总结

Reset_Handler的汇编实现虽然简洁,但它通过调用SystemInit__main,精准地完成了从硬件复位到C语言应用程序执行所必需的系统时钟配置和运行时环境搭建。理解这个过程对于深入掌握GD32(以及类似ARM Cortex-M内核MCU)的启动机制和进行底层开发至关重要。

http://www.dtcms.com/a/466886.html

相关文章:

  • 茶艺实训室:为学习者打造专业茶艺实操平台
  • 机械设计网站推荐贵州建设监理网站培训通知栏
  • 常州网站制作策划手机制作网站主页软件
  • 淘宝天猫优惠券网站怎么做工作啦
  • H3C 实现ACL 访问控制
  • 【北京迅为】iTOP-4412精英版使用手册-第三十七章 Hello_Driver_Module
  • 1 建设好自媒体门户网站网站备案要几天
  • GESP C++等级认证三级13-操作string2-2
  • 富连网网站开发数字营销成功案例
  • 我的网站 dedecms网站开发模式分为
  • 【附代码】Jupyter 多进程调用 seaborn 并保留格式
  • 正规手机网站建设平台之梦一个系统做多个网站
  • 服务器数据恢复—Raid5多盘掉线,存储如何“起死回生”?
  • 郑州网站推广价vue.js合作做网站么
  • [嵌入式系统-85]:GPU内部结构
  • 珠海网站建设哪个平台好wordpress的html
  • 网站开发佛山南京微信网站建设
  • 沈阳市住房和城乡建设局网站首页wordpress会员互动
  • 建站行业现状探讨有哪些网站可以自己做加视频
  • RPA是什么?企业如何借助有赞平台实现订单与会员自动化
  • cpp03:小项目Da
  • wordpress 商品站网站建设 猴王网络
  • 整站seo优化一般多少钱仿it资讯类网站源码
  • 如何建设一个静态网站宝塔怎么做网站的301跳转
  • 做静态网站有什么建议佛山家居网站全网营销
  • 【武大图书馆事件全过程】免费分享
  • SVN 抓取状态
  • Shell 脚本编程全解析:从入门到企业级实战
  • 嘉兴做网站优化杭州小周seo
  • 把网站做成app大冶市建设局网站