嵌入式开发:如何将嵌入式代码库从C转换为C++?

news2024/10/6 6:48:08

  几十年来,嵌入式软件工程师们一直在争论是否应该使用C++替代C语言进行开发工作。56%的嵌入式软件是用C语言编写的。然而,C++已经逐渐普及,大约23%的新嵌入式软件项目都是用C++编写的。那么,嵌入式开发人员要如何将嵌入式代码库从C转换为C++?

  这种过渡最好分四个阶段进行:

  1.编译器应该将源代码解释为C++而不是C。

  对于某些编译器,将源文件从“.c”重命名为“.cpp”就足够了;其他命令行需要特定的参数。由于C几乎是C++的子集,所以这一步骤通常不需要对源代码进行任何更改。但也有例外。重要的是,首先对整个代码库执行该步骤,否则可能无法对某些模块执行以下步骤,例如,如果其他模块使用这些模块,此步骤还可能导致“损坏”,即对生成的链接器符号的名称进行破坏。对于链接“.c”和“.cpp”模块,需要外部“c”。可以通过同时对所有模块执行此步骤来避免这种情况。

  2.修改代码以使用简单的C++语言特性。

  为了从更好的语法和更高的类型安全性中获益,现在嵌入式开发人员可以通过以下方式改进以前的C代码:

  l 使用名称空间而不是前缀变量/函数名称;

  l 使用作用域枚举而不是常规C枚举;

  l 使用C++bool代替专门定义的C bool;

  l 使用static_assert而不是运行时断言(如果可能);

  l 使用constexpr而不是常量宏,并且(如果可能)使用const

  l 使用模板函数而不是“函数”宏。

  3.将可识别的模拟“C-OOP代码”转换为真实的OOP代码。

  例如,有一个名为INSTANCE_T的结构,指向该结构的指针被传递给编辑它的各种函数。将结构转换为适当的类,并将函数转换为类组件。不要忘记正确指定public/private。如果有init函数,嵌入式开发人员请记住将其转换为类的构造函数。

  在前三个步骤中,源代码变得更加可读、可维护和类型安全。根据我们的经验,在大多数情况下,可执行代码的大小不会改变。我们甚至可以在ROM中的大多数模块上执行步骤1和2,因为在可执行代码中,没有一个字节通过重新编译而改变。

  

  4.引入更复杂的OOP方法和其他C++语言特性。

  你应该小心地迈出最后一步。例如,开发团队应该收到关于应该使用哪些C++语言特性以及如何使用的指南。例如,类成员函数不应被不必要地定义为虚拟,也不应使用STL。

  新模块现在将从一开始就按照这些指南进行编程。然而,将这一步骤应用于整个现有代码库需要大量的工作。一个好的策略是嵌入式开发人员有选择地为每个模块执行最后一步,例如,如果模块无论如何都要进行重构。随着时间的推移,代码库从C变为更复杂的C++代码。我们的代码库已经过渡了大约三年。在此期间,已有数十种产品从这个代码库中脱颖而出。一些较旧且非常稳定的模块(例如设备驱动程序)仍在C语言中,并将保持更长时间。我们从未觉得这种混合是同一代码库中的问题。

  结论:使用C语言,代码更安全、更可维护++

  有一个强大的C++子集适合于实现深度嵌入式系统。这允许程序员编写更安全、更可维护的代码,并实现在C语言中不可能实现的优化。通过在上述子集内移动,可以避免可执行代码中不必要的开销。嵌入式开发人员使用四阶段方法,可以将现有的生产代码库从C灵活地转换为C++。

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

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

相关文章

基于RK3399+Linux QT地面测试台多参数记录仪测试平台软件设计

随着高科技技术在现代化战争中日益重要作用,飞行装备的研制亦从单元体制发展 到多元体制。航空装置系统在设计过程中,需要大量测试工作,尤其是需要把系统研制 和飞行试验中各部分工作状态参数实时记录,用以分析、改进设计。记录仪…

006 金融工具库funcat安装教程及异常处理

funcat库集合了同花顺、通达信等的常用公式,安装后可以直接使用公式制定策略。 funcat常用公式可参考github说明:GitHub - cedricporter/funcat: Funcat 将同花顺、通达信、文华财经麦语言等的公式写法移植到了 Python 中。 常见异常: 使用…

干货解答:如何设置Facebook Messenger 自动回复?

Facebook Messenger 自动回复消息是提升客户体验的有效方法。在本文中,我们将探讨设置Facebook 自动响应和不同的创建方法 Facebook 自动回复。另外,我们准备了一些最受欢迎的 Facebook Messenger 自动回复消息。Facebook Messenger 自动回复&#xff1a…

Kafka消费分组和分区分配策略

Kafka消费分组,消息消费原理 同一个消费组里的消费者不能消费同一个分区,不同消费组的消费组可以消费同一个分区 (即同一个消费组里面的消费者只能在一个分区中) Kafka分区分配策略 问题 用过 Kafka 的同学用过都知道&#xf…

idea启动报错If you already have a 64-bit JDK installed, define a JAVA HOME variable

IDEA启动报错,如下图所示: 解决方法: 1.根据以下路径找到文件idea64.exe.vmoptions ,路径如下图所示: C:\Users\Thinkpad\AppData\Roaming\JetBrains\IntelliJIdea2020.3\idea64.exe.vmoptions 其中Thinkpad是电脑的…

0401不定积分的概念和性质-不定积分

文章目录1 原函数与不定积分的概念1.1 原函数1.2 原函数存在定理1.3 不定积分2 不定积分的性质3 基本积分表4 例题后记1 原函数与不定积分的概念 1.1 原函数 定义1 如果在区间I上,可导函数F(x)的导航为f(x),即对任一x∈Ix\in Ix∈I,都有 F′…

ubuntu转储coredump

方法一: 输入以下命令即可,其中${USER}为自己电脑的用户名: ulimit -c unlimited echo "/home/${USER}/core.%p" > /proc/sys/kernel/core_pattern 方法二: Disable apport : sudo systemctl stop apport.servicesudo system…

【Git】Git的分支操作

目录 4、 Git 分支操作 4.1 什么是分支 4.2 分支的好处 4.3 分支的操作 4、 Git 分支操作 4.1 什么是分支 在版本控制过程中, 同时推进多个任务, 为每个任务, 我们就可以创建每个任务的单独分支。 使用分支意味着程序员可以把自己的工作…

98%的程序员,都没有研究过JVM重排序和顺序一致性

文章整理自 博学谷狂野架构师 重排序 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型: 名称代码示例说明写后读a 1;b a;写一个变量之后,再…

YOLOv5改进、YOLOv7改进IoU损失函数:YOLOv7涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数

💡该教程为改进入门指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:YOLOv7改进IoU损失函数&am…

[手把手教你]实现简单的登录跳转以及tab栏的动态渲染

需求:实现login登录页输入用户名和密码, 匹配失败显示提示信息, 成功则跳转到index主页index页面中各组件通过嵌套路由实现,点击一级菜单可以动态显示二级菜单1.使用vite搭建项目安装初始化npm init vuelatest选择配置进入项目目录,安装模块npm i, 启动项目npm run dev2.项目目…

【答疑现场】我一个搞嵌入式的,有必要学习Python吗?

【答疑现场】我一个搞嵌入式的,有必要学习Python吗? 文章目录1 写在前面2 一个结论3 Python在嵌入式领域能干啥事4 Python是用来干大事的5 友情推荐6 福利活动大家好,我是架构师李肯,一个专注于嵌入式物联网系统架构设计的攻城狮。…

FPGA纯vhdl实现MIPI CSI2 RX视频解码输出,OV13850采集,提供工程源码和技术支持

目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利:工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰…

Hive---浅谈Hive

浅谈Hive 文章目录浅谈HiveHive文件映射Hive组件元数据(Metadata)元数据存储元数据服务(Metastore)Metastore配置方式Metastore远程模式Hive启动方式第一种(本地)第二种beelineHive Apache Hive作为一款大…

电子作业指导书系统能树立良好的生产形象

“制造”就是以规定的成本、规定的工时、生产出品质均匀、符合规格的产品。从全球新能源汽车的发展来看,其动力电源主要包括锂离子电池、镍氢电池、铅酸电池、超级电容器,其中超级电容器大多以辅助动力源的形式出现。那么,电子作业指导书系统…

吐血整理AutoSAR Com-Stack 的配置【基于ETAS】

总目录链接>> AutoSAR入门和实战系列总目录 文章目录01.软件组件和系统说明02.基本软件配置03.系统数据映射04.代码生成05.代码整合06.测试下图显示了基于 AUTOSAR 的 ECU SW 的结构。纵观BSW,大体分为三层。三层模块中,与通信相关的模块称为通信…

修改一个对象的所有者

警示:本文需要你懂点儿 “技术”。 修改一个对象(例如一个文件)的所有者看起来不是很复杂:你只需要调用 SetNamedSecurityInfo 并传入一个新的安全描述符就可以了,是的,就是这么简单。 难点在于,你如何到达这个调用时…

分布式之Quorum NWR算法

写在前面 假设现在我们实现了AP 系统,但是公司突然要对某些业务进行实时的数据计算,并且要求按照强一致性的方式来读取数据,此时作为系统设计这的我们该怎么办呢?单独为这部分业务实时抽出最新数据?还是修改原有系统&…

个人服务器+博客网站搭建

实现目标: 远程访问windows远程访问linux并在该环境开发(ssh)个人博客网站运 环境准备 准备一台性能较好的个人电脑,推荐台式机,仅在环境搭建初期需要显示器,后期使用基本不需要屏幕。规划好磁盘使用&…

从0探索NLP——神经网络

从0探索NLP——神经网络 1.前言 一提人工智能,最能想到的就是神经网络,但其实神经网络只是深度学习的主要实现方式。 现在主流的NLP相关任务、模型大都是基于深度学习也就是构建神经网络实现的,所以这里讲解一下神经网络以及简单的神经网络…