目录
前言
回顾嵌入式开发
C++在嵌入式系统开发中的作用(所当担的角色、为什么要学习C++)
面向对象编程
面向对象的三大特征
面向对象的两个核心概念
面向对象带来的好处
学习C++的意义
C++语言标准
C++编程范式
这个暑假是我第三次重新学习C++了,第一次是大二寒假跟着教程和网上资料自学C++,学得很肤浅。第二次是大二下学期跟着学校老师上课的教学学习C++,学得比较基础,学校老师只教了C++相对于C的增强、继承、封装、多态,之后便是自己继续自学C++,零零散散,包括模板、输入输出流、C++文件类、异常处理还有STL标准模板库,直到大二暑假结束才算是比较完整地学完了C++。大三开始由于接触嵌入式硬件相关方面的学习,对C++的使用越来越少,以至于很多知识点逐渐遗忘,每次做软件应用的项目开发的时候都不得不按照知识点进行查漏补缺。
有幸这个大三暑假开始,能够进入校企培训机构,对嵌入式C++进行重新的深入学习。在接下来的近两个月里我将发布一套比较详细完整的C++学习教程笔记。希望能帮助到更多的小伙伴一起学习伟大的编程语言——C++!
对C++语言的评价可参考 如何评价 C++ ? - 知乎
什么是嵌入式?
总的来说,嵌入式就是在已有的硬件平台上移植了操作系统,降低软硬件之间的耦合读,移植性高;是软件工程师无需考虑硬件结构参与项目,提高了产品的开发效率,提高了用户体验率。
什么是嵌入式操作系统?
嵌入式操作系统是一种用途广泛的系统软件;负责系统全部的软硬件资源分配,任务管理,控制协调各个进程;使软硬件之间的耦合度降低,使其依赖于一个不变的体系;将软硬件分离开来,推动项目进度,提高产品的开发效率。
什么是面向过程开发?
把一个任务拆解为多个任务,一个任务一个任务顺序执行。
什么是面向结构的编程?
面向过程(函数套函数,结构套结构):缺点:耦合度高、关联性强(复用性差(能直接移植代码而不关联其它函数)、维护性差(能够准确找到错误点,并改正)、扩展性差(添加新的代码而不修改原来的代码))
为什么嵌入式开发选择C语言?
C语言最大的特点是能够直接访问硬件,嵌入式就是在已有的硬件平台上移植操作系统,操作系统几乎都是由C语言实现的。操作系统就是把对应的硬件转换成对应的地址。
我们说传统开发分为上层软件、底层硬件,而在嵌入式开发中在上层软件和底层硬件之间加入了一层操作系统,来解决软硬件之间的耦合度的问题。
而在真正的嵌入式开发中我们还需要引入一层中间件。
由于上层软件直接访问操作系统,由于操作系统提供的编程接口过于复杂,会影响到软件的开发效率,这也就是所说的系统调用。
每次都要从用户空间切换到内核空间,保存用户态的上下文(保护现场),然后从内核态返回的时候再切换到用户态(恢复现场)。我们在做开发的时候,尽量要减少内核空间和用户空间的切换次数。比如在文件系统中read和fread的区别,一个是系统调用、一个是库函数,一个不带缓冲、一个带缓存。为什么说缓存区的大小会影响我们的读写效率?因为有了缓冲区就可以减少用户空间和内核空间的切换次数,提高运行效率。而缓冲区正是由上层软件和操作系统之间的中间件带来的。操作系统解决了软硬件之间的耦合度,那么中间件正是解决了上层软件和操作系统之间的耦合度。
操作系统可以增强硬件的可移植性(可以使软件支持多个硬件平台);而中间件可以实现软件的跨平台(比如一个软件既可以在Linux系统运行,也可以在Windows系统运行)。这也是实际开发所需求的。
比如我们再进行网络编程开发的时候,比如创建TCP服务器,我们首先要创建socket套接字,然后绑定、监听。我们可以把这些固定步骤封装成一个函数,然后每次使用的时候直接调用。也就是把许多接口封装成一个更简单的接口,从而使代码更高效,提高了开发效率。
嵌入式开发一般分为什么?
嵌入式开发一般分为上层应用软件开发(C++ 、Linux)和底层系统软件开发(C、汇编、硬件MCU、物联网相关知识),此外再细分还可以包括嵌入式硬件开发(PCB、数电模电、SOC)。因此优秀的嵌入式工程师应该同时兼备软硬开发能力,此外还需要具备物联网相关知识。
通常认为嵌入式系统可以划分为硬件层、操作系统层和应用程序层一共三大层次。
操作系统层的作用:操作系统负责提供各种通用的服务和接口,以方便应用层与底层硬件之间进行交互,降低应用层与底层硬件之间的耦合度,大大提高了应用层软件的可移植性。(通过软件访问操作系统、操作系统再来访问硬件,从而解决软硬件之间的耦合度的问题,有了操作系统之后,不管底层硬件怎么变化,上层软件都不用变)
而在应用层软件和操作系统之间,我们可以进一步抽离出一层中间件。
中间件的作用是提供软件层和操作系统之间交互的接口,方便应用层软件与操作系统之间的交互。
中间层的优点:
因此我们既然我们要做中间件,我们需要做到一下几点
中间件其实本质就是我们所说的库文件:如我们的C库就是属于库文件,C库函数既可以在Windows系统下用,也可以在Linux系统下用。但是open、read、write函数就不行,因为它们是系统调用接口。
因此我们选择开发库的语言,首先它的运行性能要好,其次要能把原来的操作系统接口封装成更简单的接口提供给上层。
C语言的三大特点
C语言只满足第一点,但不满足第二点。虽然C语言可以通过函数进行封装,但是它的安全性做不到好(这就涉及到了面向过程和面向对象的区别)。同时我们还要求语言编写的库可以有更好地扩展性,能够很快的扩展到更多的操作系统上使用。
运行效率高、扩展性好、维护性好(方便维护升级)。对于运行效率,C语言做的好;而对于扩展性和维护性,面向对象的语言做的好。而三者兼备的语言只有C++。
根据统计,对于库开发,尤其是核心库,有80%的库都是由C++来做的,20%是C(通过C来实现面向对象)。有人可能会问为什么没有JAVA,这是因为java语言底层正是由c++实现的,Java是纯面向对象语言。
对于C++来说,库开发是黄金岗。但是如果能力达不到或者不想做库开发,我们可以选择做应用软件开发(使用库来做开发)。
简单来说分为两点:
1、嵌入式系统分为上层软件、底层硬件、操作系统和中间件,操作系统解决了上层软件和底层硬件之间的耦合度,中间件解决了软件和操作系统之间的耦合度
2、市面上库开发80%的库都是用C++来做的,运行效率高、复用性好、维护性好、扩展性好
耦合度过高的问题:一个代码的变化会影响到其它代码,会导致复用性、维护性、扩展性变差。
因为A、B、C、D之间紧密耦合(耦合度太高、复用性太低),会导致如果调用A会影响到B、从而影响到C、影响到D。
要做到高内聚、低耦合,增强函数的独立性, 而C语言无法做到,因此C++来解决了这一个问题,通过面向对象的封装(设置访问权限)进行弥补。
什么是面向对象
面向对象是一种编程思想或编程范式。它将真实世界中的事物抽象成对象,然后由对象之间的交互来实现程序的功能。
类和对象。
抽象和封装。
标准每三年更新一次
面向过程、面向对象、面向泛型、面向模版元(模板元编程)、面向函数式(函数式编程)
函数式编程:具有代表的如labamda表达式