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

这篇具有很好参考价值的文章主要介绍了STM32中MicroLIB的关闭为什么会导致卡死----解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32MicroLIB

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

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

STM32中MicroLIB的关闭为什么会导致卡死----解析,ARM,stm32,单片机

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

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

MicroLIB

MicroLIB 是 ARM 专门为了嵌入式优化的库,用于代替 C 的标准库。据官方介绍,MicroLIB 对嵌入式设备进行了深度的优化,不仅可以使用减小代码的体积,还可以和一些嵌入式操作系统配合的很好。但是也有一些缺点,比如可能运行速度不如 C 标准库,不支持文件 I/O。
这个图来自于官网的介绍,但是下面的实际测试相同代码编译后的体积大小。
STM32中MicroLIB的关闭为什么会导致卡死----解析,ARM,stm32,单片机
STM32中MicroLIB的关闭为什么会导致卡死----解析,ARM,stm32,单片机

STM32中MicroLIB的关闭为什么会导致卡死----解析,ARM,stm32,单片机

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

Semihosting 半启动

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

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

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

为什么会卡住

如果不使用 MicroLIB 的话,默认情况下使用 printf 就会使得单片机卡住。 这是因为 printf 是的参数是基于 FILE ,也就是文件流的。
里面一定会有 sys_open, sys_exit 等函数。 下面的图里就会看到,_sys_open 的在汇编码中就有 BKPT ,就会使得停止单片机的运行。
STM32中MicroLIB的关闭为什么会导致卡死----解析,ARM,stm32,单片机

解决

不使用仿真器

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

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

使用仿真器直面 BKPT

[TODO!]文章来源地址https://www.toymoban.com/news/detail-842451.html

到了这里,关于STM32中MicroLIB的关闭为什么会导致卡死----解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • ThreadLocal-为什么会导致内存泄漏

    一个Thread中存在字段为ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals = null; 也就是说我们使用threadLocal进行set操作和get操作,其实就是操作该Thread的threadLocalMap。 这个map是一个基于数组的key和value的格式,在进行get的时候,会将调用对象this作为key进行查询。 hashMap是通过链表法,

    2024年02月03日
    浏览(19)
  • 什么是爬虫,为什么爬虫会导致服务器负载跑满

    什么是爬虫,为什么爬虫会导致服务器负载跑满

    在我们日常使用服务器的过程中,经常会有遇到各种各样的问题。今天就有遇到用户来跟德迅云安全反馈自己服务器负载跑满,给用户详细排查后也未发现异常,抓包查看也没有明显攻击特征,后续查看发现是被爬虫爬了,调整处理好了后,一切恢复正常了。我们就来简单分

    2024年02月04日
    浏览(9)
  • 关闭office提示:为什么要冒险,获取正版office

    运行cmd命令框,依次输入以下命令即可解决: reg add “HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSoftwareProtectionPlatform\\0ff1ce15-a989-479d-af46-f275c6370663” /f /v KeyManagementServiceName /t REG_SZ /d “172.16.0.1” reg add “HKLMSOFTWAREMicrosoftWindows NTCurrentVersionSoftwareProtectionPlatform\\0ff1ce15-a989-479d-af4

    2024年02月13日
    浏览(10)
  • 【Unity细节】为什么加载精灵图集直接导致Unity引擎崩溃

    【Unity细节】为什么加载精灵图集直接导致Unity引擎崩溃

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 点击运行,Unity直接崩溃退出 在加载打包后的图集时,可能图集里面没有相应的资源,

    2024年02月05日
    浏览(11)
  • 4.14 tcp_tw_reuse 为什么默认是关闭的?

    4.14 tcp_tw_reuse 为什么默认是关闭的?

    开启 tcp_tw_reuse 参数可以快速复用处于 TIME_WAIT 状态的 TCP 连接时,相当于缩短了 TIME_WAIT 状态的持续时间。 TIME_WAIT 状态的持续时间是 60 秒,这意味着这 60 秒内,客户端一直会占用着这个端口。端口资源是有限的,一般可以开启的端口为32768-61000。 如果客户端(主动关闭连接

    2024年02月11日
    浏览(8)
  • 惠普电脑/笔记本电脑为什么左下角会出现 按 ESC 进入启动选项,怎么关闭

    惠普电脑/笔记本电脑为什么左下角会出现 按 ESC 进入启动选项,怎么关闭

    惠普电脑/笔记本电脑为什么左下角会出现 按 ESC 进入启动选项,怎么关闭 查看: 现象提示图片示例: ![v 出现原因 出现这个提示,说明你关闭了 『安全启动』,开启了 『传统模式』 解决方法 首先确定你的硬盘分区是 『MBR 』还是 『GPT』,如果你的『引导盘/系统盘分区』

    2024年02月10日
    浏览(47)
  • 部署Kubernetes(k8s)时,为什么要关闭swap、selinux、firewall 防火墙?

     关于防火墙的原因(nftables后端兼容性问题,产生重复的防火墙规则) The ip tables tooling can act as a compatibility layer, behaving like iptables but actually configuring nftables. This nftables backend is not compatible with the current kubeadm packages: it causes duplicated firewall rules and breaks kube-proxy . 大概意思就是

    2024年02月02日
    浏览(16)
  • 并发术语——缓存行填充【结合Boolean为什么占32位解释】

    当多个线程同时访问不同的数据,但这些数据位于同一缓存行时,可能会导致性能下降。缓存行填充是一种优化技术,通过在数据之间插入一些无意义的填充数据,使它们位于不同的缓存行上,从而避免了不同线程同时修改同一缓存行的情况。 想象一下,你和你的朋友同时在

    2024年02月16日
    浏览(14)
  • Netty为什么高效,为什么这么受欢迎?

    Netty为什么高效,为什么这么受欢迎?

    上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。 我们先看

    2024年02月12日
    浏览(19)
  • Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

    Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

    一、Redis是什么 Redis 是一种 基于内存的数据库 ,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于 缓存,消息队列、分布式锁等场景 。         Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包