STM32中MicroLIB的关闭为什么会导致卡死----解析

STM32MicroLIB

大家好我是 MHZ 。最近又开始往回捡单片机的知识了~ 之前大学的时候都没用过 STM 的 CubeMX,这会拿来用着感觉很方便啊~ 果然科技在进步!

在开发使用 Keil 对 STM32 进行开发的时候在会有一个叫做 MicroLIB 的选项。

这个的具体原因我搜索了一下一些文章,就是说这个会是的 Keil 使用 MicroLIB 代替 C library。就不会卡死,但是呢直接使用 MicroLIB 也不好,因为里面的函数和 C 库实现的有差异,可能后面会遇到什么问题。但是呢,如果需要继续使用 C 库就需要关闭"半主机模式"。

这篇文章我想结合我查资料结合自己的理解稍微深入的聊一下这些的细节。

MHZ

MicroLIB

MicroLIB 是 ARM 专门为了嵌入式优化的库,用于代替 C 的标准库。据官方介绍,MicroLIB 对嵌入式设备进行了深度的优化,不仅可以使用减小代码的体积,还可以和一些嵌入式操作系统配合的很好。但是也有一些缺点,比如可能运行速度不如 C 标准库,不支持文件 I/O。

这个图来自于官网的介绍,但是下面的实际测试相同代码编译后的体积大小。

从 HEX 文件上来看,确实开启后确实使得编译后的文件减少了自身的 38.9% 。

Semihosting 半启动

半启动,这个名字真是够奇怪的了。这个名字绝对影响了我们对这个功能的理解。其实这个叫做半启动的功能是为了方便设备进行调试的时候使用的。甚至,在 ARM 编译器中半启动就是 C 标准库默认的实现形式。

因为在单片机上跑的很多都是裸机程序,这个裸机程序根本就不能预判你希望将你的输出重定向到哪里?到底是 UART?I2C?还是调试器等位置。

这个半启动会对单片机的运行打上一个断点。当你连接调试器的时候,调试器可以捕获半启动的发生,并在对单片机的内存空间进行读取,并完成解析。然后调试器再让单片机从中断返回以继续运行程序。

为什么会卡住

如果不使用 MicroLIB 的话,默认情况下使用 printf 就会使得单片机卡住。 这是因为 printf 是的参数是基于 FILE ,也就是文件流的。

里面一定会有 sys_open, sys_exit 等函数。 下面的图里就会看到,_sys_open 的在汇编码中就有 BKPT ,就会使得停止单片机的运行。

解决

不使用仿真器

将下面的代码插进去,告知编译器不再使用半启动的方式去对待C库函数。

c 复制代码
// 禁用半主机:
#pragma import(__use_no_semihosting)     //关闭半主机模式,只需要在任意一个C文件中加入即可。

使用仿真器直面 BKPT

TODO!

相关推荐
女神下凡3 分钟前
芯参谋(84):Linux eMMC 驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件
szxinmai主板定制专家12 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
泛凡(Linyongui)16 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
糖糖单片机设计17 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
金色光环21 小时前
【DSP学习】C2000_PWM中断程序_笔记
笔记·单片机·学习
智购科技智能售货柜21 小时前
顾客已经关门,视觉售货柜还在处理旧画面:延迟积压怎么查?~YH
python·单片机·嵌入式硬件·物联网·eclipse
糖糖单片机设计21 小时前
基于 STM32 的智能电蚊香控制系统
stm32·单片机·嵌入式硬件
zhangrelay1 天前
Arduino-MEGA-ESP单片机理论课笔记-01入门-02硬件-03开发环境-2026
笔记·单片机·嵌入式硬件·学习·机器人
AlanAshley1 天前
手机与电脑的屏幕计时器熄屏区别及协议栈
单片机·智能手机·电脑
AlanAshley1 天前
电脑烧屏的软件与硬件原因全解析
单片机·嵌入式硬件·电脑