如何确保不使用动态内存

  在许多嵌入式应用程序中,内存分配必须是静态的,而不是动态的。意味着在应用程序中不应使用对malloc()或free()等内容的调用,因为它们可能会在运行时失败(内存不足、堆碎片)。

  但是,当与第三方库甚至 C/C++ 标准库链接时,如何确保不使用动态内存?对于C++对象或对 printf()的简单调用,也可能会出现此问题,该调用需要在内部分配一些动态内存。

1、零堆大小?

  一种简单(而且相当幼稚)的方法是将堆大小设置为零。大多数链接器脚本或链接器环境都能够将堆大小设置为零,如下所示:

  但是,这无济于事,因为大多数链接器脚本只使用堆栈空间和变量 (bss) 之间的可用空间: 因此,将堆大小设置为零只是假设保留为零,但库的 _sbrk()将继续使用动态内存,可能会崩溃到堆栈空间。

  底线:大多数链接器脚本堆大小设置为零将无济于事。它甚至增加了堆崩溃到堆栈中的可能性,因为链接器假定堆的使用量为零。但它不会阻止使用堆。

2、堆在链接器文件中

  这可以从下面显示的链接器文件中看出:

  若要确保不使用堆,最简单的方法是简单地删除上述链接器文件中的 .heap 分配。检查链接器文件中是否有“堆”或类似内容,并确保没有为其分配内存。特别是确保没有使用符号“__prvHeapStart”或“__prvHeapLimit”,因为它们通常是newlib/newlib-nano库动态内存分配所必需的。

3、链接器自由标记脚本

  恩智浦MCUXpresso IDE等某些环境正在使用自动生成的链接器文件。但是,如果您了解它使用的FreeMarker脚本,则很容易处理此问题。脚本位于

<MCUXpresso IDE Installation Path>\ide\Wizards\linker

  所以我可以使用修改后的 FreeMarker 脚本轻松禁用 .heap:

4、__sbrk()

  删除堆及其符号后,malloc()的任何用法都应该给出一个链接器错误,类似于这个错误:

Invoking: MCU Linker
arm-none-eabi-gcc -nostdlib -Xlinker -Map="AEMBS_tinyK22_HS22.map" -Xlinker --gc-sections -Xlinker -print-memory-usage -Xlinker --sort-section=alignment -Xlinker --cref -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -T "AEMBS_tinyK22_HS22_Debug.ld" -o "AEMBS_tinyK22_HS22.axf" ./utilities/fsl_assert.o ...  ./McuLib/FreeRTOS/FreeRTOShooks.o   
arm-none-eabi/bin/ld.exe: arm-none-eabi/lib/thumb/v7e-m+fp/hard\libcr_newlib_semihost.a(_cr_sbrk.o): in function `_sbrk':
_cr_sbrk.c:(.text._sbrk+0x38): undefined reference to `_pvHeapStart'

5、链接器交叉引用

  如果不清楚使用内存分配或导致错误的原因,可以使用链接器交叉引用。为此,必须将 GNU 链接器 –cref 选项添加到链接器选项中:

  这会在链接器 .map 文件中生成如下所示的信息:

Cross Reference TableSymbol                                            File
ADC0_DriverIRQHandler                             ./startup/startup_mk22f51212.o
ADC0_IRQHandler                                   ./startup/startup_mk22f51212.o
ADC16_ClearStatusFlags                            ./drivers/fsl_adc16.o
ADC16_Deinit                                      ./drivers/fsl_adc16.o
...
main                                              ./source/main.o./startup/startup_mk22f51212.o
malloc                                            arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-malloc.o)arm-none-eabi/lib/thumb/v7e-m+fp/hard\libc_nano.a(lib_a-rand.o)./drivers/fsl_common.o
mcgConfig_BOARD_BootClockRUN                      ./board/clock_config.o

  这给出了使用 malloc()之类的模块列表。

6、图像信息

  找出依赖关系的另一种方法是在 Eclipse/MCUXpresso 中使用“图像信息”视图,请参阅在构建后操作中列出具有 GNU 大小实用程序的所有文件的代码和数据大小:

7、免费实时操作系统静态内存分配

  更多旁注:默认情况下,FreeRTOS 使用自己的动态堆分配。但是可以静态方式运行 RTOS(无动态内存分配),请参阅带静态内存分配的 FreeRTOS V9.0.0。

8、总结

  许多应用程序不需要动态内存分配和使用。为了防止使用 malloc()和 free(),最好删除链接器文件中的任何堆定义,以导致链接器错误。那么 GNU 链接器交叉引用表或图像信息可能非常有用。

9、链接

  • 使用 FreeMarker 脚本的示例:教程:将 BLE+NRF Kinetis Design Studio Project 移植到 MCUXpresso IDE
  • 带有 FreeMarker 脚本的引导加载程序:将引导加载程序应用程序与 Eclipse 和 FreeMarker 脚本链接起来
  • 自由标记脚本:https://freemarker.apache.org/

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go 单元测试 testing 打印输出_2020,你需掌握go 单元测试进阶篇

本文说明go语言自带的测试框架未提供或者未方便地提供的测试方案&#xff0c;主要是用于解决写单元测试中比较头痛的依赖问题。也就是伪造模式&#xff0c;经典的伪造模式有桩对象(stub),模拟对象(mock)和伪对象(fake)。比较幸运的是&#xff0c;社区有丰富的第三方测试框架支持…

一文读懂Git工作流

Git是目前最流行的代码管理工具&#xff0c;相信大家也都是在用Git来管理自己团队的源代码。 团队一般为了规范开发&#xff0c;保持良好的代码提交记录以及维护 Git 分支结构清晰&#xff0c;方便后续维护等&#xff0c;都会迫切需要一个比较规范的 Git 工作流。 本文就是在…

xbox360fsd更新游戏封面_游戏类短视频创作指南

一&#xff0e;起步阶段1.内容发布垂直&#xff0c;整体风格一致&#xff0c;选定一个品类的游戏内容风格持续更新注意&#xff1a;冷启动时期不要频繁更换游戏类型2.账号IP化 根据自身风格特色打造独特的风格账号。有利延长账号生命周期&#xff0c;提升粉丝转化率。搞笑、中二…

开发者们都在关注的网站

开发者们都在关注的网站 &#x1f609; 综合类&#xff08;5个&#xff09; 1、GitHub 全球最大的编程开源社区&#xff0c;很多优秀的开源项目都在上边&#xff0c;不知道这个都不要说自己是程序员&#x1f602; 访问地址&#xff1a;https://github.com 2、CSDN 全球最大中…

ios framework 调用第三方 framework_Python基础:标准库和常用的第三方库

Python的标准库有&#xff1a;名称作用datetime为日期和时间处理同时提供了简单和复杂的方法。zlib直接支持通用的数据打包和压缩格式&#xff1a;zlib&#xff0c;gzip&#xff0c;bz2&#xff0c;zipfile&#xff0c;以及 tarfile。random提供了生成随机数的工具。math为浮点…

作图神器ProcessOn - 免费好用

因工作需要&#xff0c;我经常需要花一些流程图&#xff0c;时序图&#xff0c;架构图什么的&#xff0c;之前使用的Windows系统&#xff0c;大部分情况下就用的Visio来画图。后来为了工作方便&#xff0c;换成了Mac电脑&#xff0c;结果发现Mac上没有Visio&#xff0c;然后就在…

三电平igbt死区时间计算_基于大功率三电平IGBT模块并联的参考设计

当前的可再生能源行业中&#xff0c;光伏和风力发电均面临着补贴逐步退坡&#xff0c;平价上网时代即将到来的挑战。为应对这一挑战&#xff0c;光伏逆变器和风力变流器厂家研发的新品单机功率越来越高&#xff0c;以取得更低的单位功率成本。市场上1.5MW的集中式光伏逆变器和3…

手把手教你搭建开发环境之Java开发

大家好呀&#xff0c;从今天开始&#xff0c;我们的手把手系列教程就正式开始啦。 如果你觉得本文对你有一些帮助&#xff0c;欢迎大家关注、点赞、分享给需要的小伙伴们&#xff0c;谢谢大家啦。 前言 Java虽然是一个比较老的语言&#xff0c;但到现在依然充满了活力&#x…

opc服务器组态文件已写保护_远程组态软件不仅方便了PLC无线远程监控,也大大降低了工程成本...

远程组态软件不仅方便了PLC无线远程监控&#xff0c;也大大降低了工程成本组态软件远程监控1.本地上位SCADA系统采集分布各地现场PLC等设备运行的数据&#xff0c;并可以下发控制指令&#xff1b;2.提供稳定的OPC接口服务&#xff0c;常年稳定运行&#xff0c;规模可达10万数据…

奇妙的安全旅行之加密算法概述

前言 hi&#xff0c;大家好呀&#xff0c;信息安全作为当前社会中比较重要的一个课题&#xff0c;已经覆盖了人们生活的方方面面&#xff0c;虽然有时候我们可能并没有意识到&#xff0c;其实信息安全防护已经在背后默默的保护我们的信息安全了。例如&#xff0c;当你在互联网…

怎么调节电机启动值_开关式智能充电机-全自动充电机-铅酸电池充电机品牌-济南能华...

开关式智能充电机-全自动充电机-铅酸电池充电机品牌-济南能华NHCD系列 全自动智能充电机&#xff0c;可调智能充电机&#xff0c;可调直流充电机&#xff0c;可调全自动充电机 &#xff0c;可调蓄电池充电机 便携式可调智能充电机 便携式全自动充电机 大功率可调充电机 大功率智…

奇妙的安全旅行之MD算法

hi&#xff0c;大家好&#xff0c;今天我们开始介绍消息摘要算法中的MD&#xff08;Message Digest&#xff09;算法&#xff0c;MD算法家族包括&#xff1a;MD2&#xff0c;MD4&#xff0c;MD5&#xff0c;MD算法生成的消息摘长度要都是128位的。 其中MD5算法是消息摘要算法的…

的图层类型有哪些_东莞都市领航平面设计培训班都学习哪些内容?

平面设计的工作稳定性是很高的&#xff0c;经济繁荣时期毫无疑问&#xff0c;即使经济下滑&#xff0c;仍不会有很大影响&#xff0c;以前两年为例&#xff0c;北美的大规模裁员浪潮&#xff0c;给高科技行业带来巨大冲击&#xff0c;放慢了高科技产品的开发速度&#xff0c;当…

dockerfile拉取私库镜像_还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点...

原文转载自「刘悦的技术博客」https://v3u.cn/a_id_173一般情况下&#xff0c;当你想为你的Python开发环境选择一个基础镜像时&#xff0c;大多数人都会选择Alpine&#xff0c;为什么&#xff1f;因为它太小了&#xff0c;仅仅只有 5 MB 左右&#xff08;对比 Ubuntu 系列镜像接…

2020,再见;2021,我来了!

现在是2021年1月16日下午16点33分&#xff0c;星期六。此时北京正在通报昨日新冠肺炎新增病例情况&#xff0c;这种每天戴口罩的鬼日子还不知道什么时候能结束。最近由于天气变冷&#xff0c;病毒更容易存活和传播&#xff0c;最近一个月就突然又变的非常紧张起来了&#xff0c…

cuda tensorflow版本对应_Windows10下安装tensorflow-gpu(2.2.0)安装教程(避坑+保姆式教学)...

本文实现了Windows10下GPU版本的tensorflow2.2.0的安装&#xff0c;用到的软件主要包括&#xff1a;CUDA 10.2 cuDNN Anaconda tensorflow-gpu 2.2.0。&#xff08;注&#xff1a;此教程在Win7环境下也同样适用&#xff01;另附报错缺少cudart64_101.dll的解决办法&#xff…

奇妙的安全旅行之DES算法(二)

hi&#xff0c;大家好&#xff0c;上一节我们详细介绍了对称加密算法DES的基本内容&#xff0c;由于明文的长度不固定&#xff0c;而加密算法只能处理特定长度的一块数据&#xff0c;所以就需要对比较长的明文进行分组后再加密&#xff0c;但是分组后&#xff0c;最后一组的长度…

c++创建虚拟串口_linux虚拟串口控制器驱动实现——适用于无开发板学习串口驱动...

在上一章我们已经说明了uart驱动的开发流程&#xff0c;本章我们就不再介绍uart相关的接口实现&#xff0c;仅通过实现一个虚拟的串口控制器程序&#xff0c;用以说明虚拟串口的开发流程。本次开发的虚拟串口提供的功能如下&#xff1a;提供两个串口实例串口名称的前缀为vttyU为…

奇妙的安全旅行之AES算法

hi&#xff0c;大家好&#xff0c;今天开始我们来介绍一下对称加密算法中的AES算法。 AES简介 AES&#xff08;英语&#xff1a;Advanced Encryption Standard&#xff0c;缩写&#xff1a;AES&#xff09;&#xff0c;即高级加密标准&#xff0c;在密码学中又称Rijndael加密…

axios vue 回调函数_前端Vue 面试题大全

点蓝色字关注“程序员报刊” 「学习 新闻 招聘 」vue的底层原理?vue组件之间的通信&#xff1f;JS中判断数据类型的方法有几种?最常见的判断方法&#xff1a;typeof判断已知对象类型的方法&#xff1a;instanceof根据对象的constructor判断&#xff1a;constructor无敌万能的…