当前位置:首页 > 技术学院 > 技术前线
[导读]嵌入式C语言编程规范和内存管理技巧。嵌入式系统开发中,由于单片机的堆栈空间较小,局部变量和动态分配变量容易导致内存溢出,因此需要在编译期准确计算内存占用量,并进行相应的堆栈空间大小修改。刚好我总结了一些嵌入式资料放在文章结尾,为避免这种情况的发生,全局变量是一种更好的选择,因为可以在编译期准确计算内存占用量,从而避免内存溢出。在嵌入式C语言编程中,模块化编程是一种重要的方法。

内存安全编程语言可以帮助解决特定的问题,并降低内存相关错误的可能性,但它们不是包罗万象的。在一种内存安全的语言中,你仍然可能会遇到内存问题和错误。所以内存安全语言是嵌入式开发人员可以用来解决问题的另一个工具。

嵌入式C语言编程规范和内存管理技巧。嵌入式系统开发中,由于单片机的堆栈空间较小,局部变量和动态分配变量容易导致内存溢出,因此需要在编译期准确计算内存占用量,并进行相应的堆栈空间大小修改。刚好我总结了一些嵌入式资料放在文章结尾,为避免这种情况的发生,全局变量是一种更好的选择,因为可以在编译期准确计算内存占用量,从而避免内存溢出。在嵌入式C语言编程中,模块化编程是一种重要的方法。

虽然人们普遍对迁移到Rust这样的语言感到兴奋和感兴趣,但在嵌入式领域,仍然存在许多挑战,例如:

l 培训工程师并让他们快速掌握一门新语言所需的时间和成本

l 如何处理遗留代码以及迁移现有代码的时间和成本

l 现有供应商工具链中的语言支持

如果开发人员注意他们正在做的事情并遵循行业最佳实践和过程,内存安全语言帮助开发人员避免的许多错误也可以通过使用C/C++来避免。让我们研究五种可以帮助开发人员提高内存安全性的C++技术。

技巧1——智能指针

内存问题的一个重要原因是原始指针的使用。嵌入式开发人员都熟悉指针的使用。你可以使用它们来指向外围存储器和寄存器,高效地将数据传递给函数,等等。C和早期版本的C++中的原始指针的问题是开发人员可以随心所欲地做他们想做的事情。在许多情况下,会出现内存泄漏、访问范围外的变量等问题。

在现代C++中,开发人员可以利用智能指针,包括:

l auto_ptr (在C++11中不推荐使用)

l unique_ptr

l shared_ptr

l weak_ptr

我们可以通过讨论这项工作如何超出我们的范围来讨论一般概念。

你通常可以将智能指针视为包装在类中的原始指针。智能指针有几个用途。首先,unique_ptr可用于确保当指针超出范围时,发生的任何内存分配也被释放。使用原始指针并不能保证这种可能导致内存泄漏的行为。接下来,智能指针还要有主人翁意识。例如,unique_ptr防止复制其包含的指针。只允许基础指针的一个所有者。如果另一个对象想要使用unique_ptr指向的资源,可以使用move语义来转移所有权。

使用C++的嵌入式开发人员应该避免像在C中那样使用原始指针,相反,智能指针是一种更好的做法,有助于防止导致错误和安全漏洞的常见内存问题。

技巧2——避免使用动态内存和堆

几十年来,避免动态内存和堆一直是基于微控制器的嵌入式系统的标准最佳实践。当然,使用它们是可能的,我有时这样做是为了证明一个观点,但是也有可能引入与内存相关的错误,比如内存泄漏、碎片和其他潜在的问题。

使用C++的嵌入式开发人员可以通过避免动态内存和堆来提高避免内存问题的机会。有几种不同的方法可以做到这一点。首先,开发者应该避免在嵌入式系统中使用标准模板库(STL)。一般来说,STL使用了大量的动态内存分配。接下来,开发人员可以禁用运行时类型信息(RTTI)。最后,禁用异常是另一种选择。异常的内存是以未指定的方式分配的,在大多数实现中是使用堆。

避免内存分配并使用堆可以立即消除内存泄漏、内存不足错误、堆碎片等问题。

技术 3–RAII

很容易概括地说,嵌入式开发人员不应该使用动态内存或堆。不过,最佳实践是一种概括,有时你可能会发现自己处于必须这样做的情况。例如,当必须使用动态内存和堆时,开发人员可以通过遵循资源获取初始化(RAII)技术来避免内存问题。

RAII是一种技术,嵌入式开发人员将对象的生命周期与其自己的资源联系起来。这个想法很简单。如果应用程序获取一个资源,一个对象应该与该资源相关联,该资源调用一个初始化该资源的构造函数。该对象在其生存期内拥有该资源。当对象超出范围时,析构函数被执行,资源和所有分配的内存被释放。

要考虑的其他技术

首先,熟悉一下零规则、五规则和三规则。当设计一个类时,这些规则有助于决定何时应该创建用户定义的复制构造函数、复制赋值操作符、析构函数、移动构造函数和移动操作符。

其次,使用静态分析工具来查找内存泄漏、线程问题、bug和其他潜在问题。同样,许多静态分析工具已经存在,比如clang、cppcheck、valgrind和商业工具。

接下来,熟悉现代C++。C++语言中有很多特性,但是实际上一个嵌入式开发者只需要其中的一小部分。你可以识别出符合你需求的子集,并抛弃其他所有东西。我知道我做过,我也用c做了同样的事情。我们的目标不是使用每种语言的特性,而是使用语言中的工具来帮助你编写健壮的实时嵌入式软件。

最后,关注对C++标准所做的更改。C++每三年更新一次。语言在不断发展,新的工具也在不断增加。安全性和内存安全是至关重要的,我们很可能会在未来看到语言在这方面的许多改进。

结论

C++不是内存安全的语言;然而,许多特性和技术可以用来编写内存安全的代码。最终,无论你是否使用内存安全语言,嵌入式开发人员都需要考虑他们正在做什么,以及它如何影响内存。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭