STM32_while死循环问题

本文探讨了在编程中如何正确使用begin_flag作为程序控制标志,避免因标志位设置不当导致的程序卡死问题。当标志位为1时,程序能够正常退出循环,确保程序流程的顺畅和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

begin_flag为按键标志位,这样写无论如何都会卡死。

在这里插入图片描述
这样写,当标志位为1时程序跳出循环,不会卡死。

### STM32 中 `__main` 函数的作用 在嵌入式开发环境中,尤其是基于 ARM Cortex-M 的微控制器(如 STM32),程序启动过程通常由编译器工具链自动处理。`__main` 是一个特殊的函数名称,在许多 ARM 编译器中被用来表示程序的入口点[^1]。 #### 启动流程概述 当 STM32 微控制器上电或复位时,硬件会跳转到存储在向量表中的初始地址执行代码。这个初始地址指向的是启动文件(startup 文件)中的重定位代码部分。随后,控制权会被传递给 C 运行库初始化代码,即 `__main` 函数所在的位置。此阶段的主要功能包括: - **栈指针初始化**:设置 MSP 或 PSP 寄存器以定义堆栈区域。 - **数据段拷贝**:将位于 Flash 中已初始化的数据复制到 SRAM 对应位置。 - **BSS 段清零**:清除未初始化全局变量所在的 BSS 区域。 - 调用用户的 `main()` 函数。 这些操作完成后,才正式进入用户编写的应用逻辑。 #### 使用方法与注意事项 尽管开发者不需要手动实现 `__main`,了解其工作原理有助于调试复杂项目或者定制化固件行为。如果需要自定义启动序列,则可以修改链接脚本以及 startup.s 汇编源码来绕过默认提供的运行期环境准备步骤。 下面展示了一个简单的例子说明如何通过调整 linker script 和 assembly file 来掌控整个 process: ```c // main.c - 用户主程序 #include <stdint.h> void SystemInit(void); // 可选系统配置函数声明 int main() { uint32_t counter = 0; while (true){ // 主循环体 ++counter; } } ``` ```assembly /* startup_stm32f4xx.s */ .syntax unified .cpu cortex-m4 .fpu softvfp .global Reset_Handler .type Reset_Handler, %function Reset_Handler: ldr sp, =_estack /* 设置栈顶 */ bl SystemInit /* 初始化外设可选项 */ bl main /* 开始应用程序 */ loop_forever: b loop_forever /* 死循环防止退出 */ .size Reset_Handler, .-Reset_Handler ``` 注意以上仅为简化版示范用途,请依据具体 MCU 型号选用合适的模板并参照官方文档完成实际部署。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值