STM32的BLX R0

STM32调试断点过多问题
本文记录了作者在调试STM32过程中遇到的问题,由于设置过多的断点导致程序卡住。通过减少断点数量,成功解决了该问题。

今天在调试STM32的时候BLX     R0

      Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

一直都在卡着,还以为是单片机出了问题,原来是打的断点太多了。2017.10.30

### Reset_Handler 汇编代码分析 在STM32启动文件中,`Reset_Handler` 是一个关键的汇编代码段,它负责处理器的基本初始化,并最终跳转到C语言的 `main` 函数。以下是对 `Reset_Handler` 汇编代码的详细分析。 ```armasm Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP ``` #### 1. 函数声明与导出 - `Reset_Handler PROC`:定义 `Reset_Handler` 为一个过程(procedure),表示这是一个汇编函数的开始。 - `EXPORT Reset_Handler [WEAK]`:将 `Reset_Handler` 导出为全局符号,并且标记为弱符号(WEAK)。这意味着如果存在其他同名的强符号定义,链接器将优先使用强符号定义。这一特性允许用户在应用程序中重写默认的 `Reset_Handler` 实现[^3]。 #### 2. 导入外部符号 - `IMPORT SystemInit`:声明 `SystemInit` 是一个外部符号,通常用于初始化系统时钟。`SystemInit` 函数在 `system_stm32f10.c` 文件中定义,负责将系统时钟配置为72MHz。 - `IMPORT __main`:声明 `__main` 是一个外部符号,这是C库的入口点。`__main` 负责初始化C运行时环境,包括堆栈、全局变量的初始化等,并最终调用C语言的 `main` 函数[^2]。 #### 3. 调用 SystemInit - `LDR R0, =SystemInit`:将 `SystemInit` 函数的地址加载到寄存器 `R0` 中。 - `BLX R0`:调用 `SystemInit` 函数。`BLX` 指令用于跳转到指定地址并切换指令集(ARM/Thumb),执行完成后返回到下一条指令。此步骤完成系统时钟的初始化,确保处理器以正确的频率运行[^1]。 #### 4. 调用 __main - `LDR R0, =__main`:将 `__main` 函数的地址加载到寄存器 `R0` 中。 - `BX R0`:调用 `__main` 函数。`BX` 指令用于跳转到指定地址并切换指令集(ARM/Thumb),执行完成后返回到下一条指令。`__main` 会完成C运行时环境的初始化,包括堆栈的初始化、全局变量的初始化等,并最终调用C语言的 `main` 函数[^2]。 #### 5. 函数结束 - `ENDP`:表示 `Reset_Handler` 过程的结束。 ### 总结 `Reset_Handler` 是STM32启动过程中的关键部分,负责初始化系统时钟并跳转到C语言的 `main` 函数。通过调用 `SystemInit` 和 `__main`,`Reset_Handler` 确保了处理器的基本初始化和C运行时环境的正确设置,从而为应用程序的执行做好准备[^3]。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值