OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2918|回复: 1

在嵌入式设计中使用C ++替代C的准则

[复制链接]

42

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2020-4-23
在线时间
22 小时
发表于 2020-5-27 17:37:17 | 显示全部楼层 |阅读模式

++的使用增长比预期的要慢得多。

有许多的原因。首先,嵌入式开发工程师非常保守,宁愿使用经过验证的解决方案,也不要使用新颖的解决方案,“ 如果无法解决,请不要解决 ”。

还有经验教训。许多开发人员试图将C ++用于嵌入式应用程序,但失败了。这种故障有时可能归因于开发工具的缺陷,但最常见的归咎于“对台式机之类的嵌入式系统进行处理”语言的不当使用。

在这个由两部分组成的教程中,我们试图解决其中的一些问题,为有效使用C ++嵌入式应用程序提供指导,并说明该语言对嵌入式开发人员有真正的好处。

一般来说,C ++在计算世界中获得普及的主要原因之一就是它的历史。尽管它是一种现代语言,具有面向对象的功能,但它具有向后兼容性,因此很容易采用“学习和应用”。

下面的图1 提供了对该语言的发展的一些见解。在本系列的后面部分,我们将更详细地介绍C / C ++的兼容性。

图1。C ++的族谱

C的局限性

尽管C被广泛地使用,但是它有局限性,因为它不是为嵌入式应用程序设计的,也不是为现在普遍规模的项目设计的。关键限制包括:

1) C非常强大且灵活,因此可能很危险。(它具有低级别的功能,这对于嵌入式系统很有用,但对于那些粗心的人也有很多陷阱。)

2) 程序员需要非常有条理和有纪律

3)程序员需要了解程序在低水平和高水平时的行为(因此难以维护大型项目)

4) 程序员需要应用程序的专业知识

但是,C ++具有强大的面向对象功能,可以极大地帮助解决C的局限性:

1) 将非专业人士的高专长领域封装和隐藏为“对象”;(一个测试用例将在本系列的第2部分的后面展示对专业知识的封装)。

2) 非专家可以直观地使用对象来实现高级概念设计

语言概述

与ANSI C一样,C ++除了具有面向对象的功能之外,还对原始C语言进行了许多增强。C ++不仅仅是C的超集,因为两种语言是并行发展的。

但是,可以逐步学习和应用该语言,如本文稍后所述。目前,以下是一些有用的语言功能的概述:

1)动态内存分配运算符。 运算符new和delete替代了库函数malloc()和free(),并导致了更具可读性和更少错误的代码。

2)功能原型。在C ++中引入并被ANSI C采纳,因此必须强制使用它们。

3)Functionparameter默认值。 函数可能具有用于跟踪参数的默认值,以增强代码的可读性。

4)参考参数。函数参数可以通过引用而不是通过值(副本)传递。这样就可以高效地使用指针,而不会因使用指针而产生错误。这是一个简单的示例函数:

void swap(int&a,int&b)

{

        int temp = a;


       a = b;

       b =温度;

}

4)内联函数。 (小)功能的代码可以声明为“内联”,即,每个呼叫站点都包含实际代码的副本。这可以提高执行速度,但可以增加代码大小。可以使用inline关键字或通过将代码包含在类定义的主体中来实现。这只是给编译器的建议,可能会考虑当前的优化设置。

5)功能重载。 可以使用相同的名称定义多个功能。编译器将通过其唯一数量/类型的参数来区分它们。这样可以使代码更具可读性,而无需进行人为的函数命名。

6)类型安全链接。 在C ++中,所有函数名称都是“混杂”的,它们的名称被修改以反映参数和返回的数据类型。这使链接器可以执行其他跨模块检查,而无需“了解” C ++。这也是实现功能重载的机制。

面向对象的功能

C ++通常被描述为一种面向对象的语言,但这并不是绝对正确的。它实际上是一种具有某些面向对象功能的过程语言(如C)。

语言的主要特征是类的概念。类与C中的结构非常相似,但是具有一些重要的区别和增强:

1)使用关键字class定义一个类。

2) 一个类可能包含代码和数据(不仅是指向函数的指针)

3)可以将 类成员声明为私有成员或公共成员,从而使关键功能被隐藏(封装)

4) 实际上,一个类是具有声明的类名称的新数据类型;数据和对该数据的可能操作已定义

5) 可能会定义(重载)运算符以操作类中的数据,从而导致可读,直观的代码

6)可能包含在创建和销毁对象时自动调用的成员函数(构造函数和析构函数)

7)一类可以从另一类派生而来,继承其所有特征,可以加以美化或替换

模板

C ++的一大特色是模板。该概念可以应用于函数或类定义。这个想法很简单:程序员可以定义类/函数的完整结构和逻辑,而不必理会数据类型(用于参数和内部变量)的规范。

当程序员实例化模板时,这充当编译器生成代码/数据的“配方”(并指示所需的数据类型)。

这是一个功能模板的简单示例:


       模板 无效掉期(X&x,X&y)         {                X温度;                temp = x;                x = y;                y =温度; }


可以这样使用:


       int i,j;

       浮动a,b;

       …

       swap(a,b); //实例#1

       wap(i,j); //实例化2


模板为所有程序员提供了“桌面和嵌入式”的强大功能,可以创建高度可重用的代码。嵌入式开发人员总是想知道“成本”,即使用模板会产生多少开销?

从理论上讲,不会有任何开销,因为模板不会自行生成代码。“代码仅在需要时由编译器创建。但是,这是一个问题的原因:编译器一次只能处理一个模块,因此模板实例化基于每个模块。

结果是在应用程序的多个模块中可能生成相同的代码“即,用一组相同的数据类型实例化的模板”。这可能会大大增加内存占用量。这对于台式机编程人员来说可能是无关紧要的,但是对于嵌入式系统开发人员来说可能非常重要。

除了简单地了解正在发生的事情之外,解决该问题的一种可能方法是拥有针对嵌入式工作进行了优化的工具。一种方法是提供一个链接程序,该链接程序可以接受编译器的“提示”并消除冗余(副本)代码。

异常处理

在几乎所有类型的软件中,都有可能发生错误情况,这种情况可能会被软件检测到。通常,这需要对某种代码进行某种“紧急出口”才能优雅地处理错误。

不幸的是,结构化编程语言(如C,C ++等)无法方便地处理这种可能性。创建C ++异常处理系统(EHS)来解决此问题。

EHS在另外三个C ++关键字中体现:try,throw和catch。try块用于控制何时激活异常处理。throw语句用于促进处理错误(异常)。一个catch块“可能有很多,每个对象类型由一个对象类型标识”包含处理错误的代码。

这是一个简单的示例,显示了EHS语法的工作方式:


       void scopy(char * str)

        {

               如果(sizeof(store)+1 <strlen(str))

                       抛出-1;

               strcpy(store,str);

        }


       void get_string()

        {

               char buff [100];


               cin >>浅黄色

               scopy(buff);

        }


       main()

        {

               试试

        {

                   …

                   get_string();

                   …

               }

        }


       抓(int err)         {                cout <<“字符串太长!”;

        }


尽管EHS简化了处理紧急情况所需的编码,但确实要付出代价:生成了额外的代码以使throw语句能够正常工作。嵌入式开发人员总是会警惕额外的开销,因此应监控此额外代码的大小。

嵌入式开发工程师还需要了解有关EHS的两点:

首先,由于编译器无法知道是否将在try块内调用特定代码段,因此将为所有应用程序模块生成额外的代码。更糟糕的是,某些编译器默认情况下启用了EHS,并且程序员有责任将其关闭。因此,如果未使用EHS,则必须检查编译器上的选项以确保不产生开销。

其次, EHS旨在促进针对多种错误情况的不同响应选择。这对于桌面应用程序是完全有意义的。但是,许多嵌入式应用程序都需要非常简单的错误处理。

通常,如果检测到“困难”错误,则会执行系统重置,因为这是恢复稳定运行状态的最佳方法。可以很合理地得出这样的结论:在这种情况下,EHS会被滥用。但是,有两种方法可以以较低的开销使用它,这可能会有利于平衡:

如果在进行抛出时未找到匹配的catch语句,则调用库函数Terminate()。例程可以替换此功能以执行系统重置。

文章来源:http://emb.hqyj.com/Column/20209468.html


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2018-12-27
在线时间
0 小时
发表于 2020-5-27 17:38:16 | 显示全部楼层
帮顶!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 07:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表