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!

相关推荐
芯岭技术8 小时前
普冉PY32F002A单片机用LPTIM唤醒stop模式
单片机·嵌入式硬件
DIY机器人工房9 小时前
QT代码框架小案例:一个简单的时间类(Time)及其实例化程序,模拟了时间的设置、显示和自动流逝功能,类似一个简易电子时钟。
stm32·单片机·嵌入式硬件·嵌入式·diy机器人工房
bai54593613 小时前
STM32 硬件I2C读写MPU6050
stm32·单片机·嵌入式硬件
IT.小航14 小时前
STM32F103RC的USB上拉电阻1.5K
stm32·单片机·嵌入式硬件
m0_5557629014 小时前
MCU 开发工具汇总
单片机·嵌入式硬件
伴杯猫15 小时前
【ESP32-IDF】高级外设开发3:I2S
c语言·单片机·嵌入式硬件·mcu·物联网·esp32·esp-idf
淘晶驰AK19 小时前
51单片机与stm32单片机,先学习哪一个?
stm32·单片机·51单片机
Moonnnn.19 小时前
【51单片机学习】AT24C02(I2C)、DS18B20(单总线)、LCD1602(液晶显示屏)
笔记·单片机·学习·51单片机
wind_one121 小时前
项目:电动车报警器
stm32·单片机·嵌入式硬件
网易独家音乐人Mike Zhou21 小时前
【Python】圆柱体内部3D点云仿真及ply文件生成,圆形3D点云检测及拟合算法
stm32·单片机·mcu·物联网·算法·点云·iot