【粉丝福利社】C++嵌入式开发实例精解

在这里插入图片描述

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2023年华为云十佳博主,2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀前言

长久以来,嵌入式系统开发基本通过C语言或汇编语言予以实现,其原因在于,硬件往往缺少应有的资源运行高级编程语言(如C 、Java或Python)编写的程序。更为重要的是,没有必要使用这些语言编写软件。有限的硬件资源限制了软件的复杂性,嵌入式应用程序的功能依然相对简单,这也使得C语言足以胜任此项工作。
随着硬件开发的不断进步,越来越多的嵌入式系统由廉价而强大的系统芯片驱动,甚至能够运行通用的多任务系统,如Linux。不断增长的硬件能力需要我们编写更加复杂的软件,因此,C 越来越多地成为新的嵌入式系统的语言。C 允许开发人员创建使用计算和内存资源的应用程序,就像使用C语言编写的应用程序一样,但为开发人员提供了更多的工具处理复杂性和更安全的资源管理问题,如面向对象编程和RAII习惯用法。
具有丰富C语言经验的资深嵌入式开发人员通常倾向于以类似的、习惯性的方式使用C 编写代码,并将这种语言视为C语言的面向对象扩展,即带有类的C语言。然而,现代C 语言拥有自己的实践方案和概念,如果使用得当,它可以帮助开发人员避免常见的陷阱,并允许开发人员在几行代码中完成诸多工作。
另一方面,当具有C 经验的开发人员步入嵌入式系统这一领域时,他们需要了解特定的硬件平台,以及应用程序领域的需求、限制条件和相关功能,进而设计C 代码。
本书旨在填补这一项空白,并演示如何在嵌入式系统中应用现代C 语言的特性和实践方案。
适用读者
本书适用于软件开发人员、电子硬件工程师、软件工程师和系统芯片工程师,可帮助他们通过C 语言构建高效的嵌入式程序。
嵌入式系统涵盖了较为广泛的领域,本书试图讨论其中的一种类型,即运行Linux操作系统的SoC,如树莓派或BeagleBoard,并简要介绍底层微控制器,如Arduino。
本书希望读者了解与C 这门编程语言相关的基础知识,但并不需要具备丰富的C 知识或嵌入式系统经验。

本书内容
第1章定义了嵌入式系统的具体含义、嵌入式系统与其他系统之间的区别、所需的特定编程技术,以及为何大多数时候C 语言是嵌入式开发的方案。另外,本章还将介绍嵌入式开发人员在日常工作中所面临的约束和挑战,即有限的系统资源和CPU性能、处理硬件错误和远程调试。
第2章解释了嵌入式系统开发环境与Web或桌面应用程序开发的区别,并介绍了构建和目标系统、交叉编译和交叉工具箱、串行控制台和远程Shell等概念。对于运行Windows、macOS或Linux的大多数常见桌面配置,本章还提供了设置虚拟化构建和目标主机的实际操作步骤。
第3章解释了C 代码中目标系统的CPU架构和内存配置之间的差别。
第4章介绍了中断和中断服务例程的底层概念。在现代操作系统中,开发人员或启动程序需要使用操作系统提供的高层API,因而需要通过8051微控制器考查中断技术。
第5章讨论基于Linux的嵌入式系统的调试技术,如在目标板(target board)上直接运行gdb、针对远程调试机制的gdb服务器,以及针对调试和故障根源分析的日志机制的重要性。
第6章提供与内存分配相关的多个示例和实践方案,这对于嵌入式系统的开发人员来说十分有用。其间讨论了为何需要在嵌入式应用程序中避免使用动态内存分配,以及快速、专用内存分配的相关替代方案。
第7章将讨论如何使用C 标准库中的函数和类实现高效的多线程应用程序,同时发挥现代多核CPU的功效。
第8章将讨论进程和系统通信间的一些概念、挑战性问题和实践方案,如Socket、管道、共享内存和基于FlatBuffers库的高效内存序列化机制。另外,本章还讨论如何将应用程序解耦为独立的组件,且这些组件使用定义良好的异步协议相互通信,这实际上是扩展软件系统同时保持其快速和容错的标准方法。
第9章将介绍如何在C 程序中与各种外围设备协同工作。虽然大多数设备通信API并不依赖于特定的编程语言,但我们仍将通过C 语言的强大功能编写封装器(这对于开发人员来说十分方便),并防止出现创建的资源泄露错误。
第10章将探讨编写高效节能的应用程序,以及利用操作系统电源管理功能的实践方案。本章针对基于Linux的嵌入式系统提供了多个示例,在此基础上,相同的概念也可扩展至其他操作系统和平台。
第11章介绍与时间管理相关的各种话题,如测算时间间隔、增加延时。此外,我们还将学习C Chrono标准库提供的API,并以此构建可移植的应用程序。
第12章将讨论C 嵌入式应用程序中错误机制的可能实现和实践方案,同时还将解释如何高效地使用C 异常机制,并将该机制与其他替代方案进行比较,如传统的错误代码和复杂的返回机制。其间将涉及一些基本的容错机制,如看门狗计时器和心跳信号。
第13章讨论实时系统规范,主要介绍实时系统的定义方式,以及实时系统所包含的类型。本章通过实际案例探讨了如何使应用程序的行为更具确定性,这也是实时系统的关键需求。
第14章考查什么是安全关键系统,以及安全系统与其他嵌入式系统之间的不同之处。本章涵盖了开发关键安全系统时所需的开发方法和工具,如编码指南(包括MISRA、AUTOSAR或JSF)、静态代码分析、软件验证工具。
第15章简要介绍微处理器C 代码的编写、编译和调试等概念。同时使用Arduino电路板作为示例,并讨论如何设置开发环境。
嵌入式系统开发意味着应用程序将与某些专用硬件进行交互,如特定的SoC平台、特定的微控制器或特定的外围设备。因此,存在多种可能的硬件配置,以及与这些硬件设置协同工作的专用操作系统或IDE。
本书旨在指导读者学习如何实现嵌入式系统编程,但不会过多地涉及硬件内容。因此,大多数示例工作于虚拟Linux环境或模拟器中,某些示例可能需要使用真实的硬件设备。这些示例将运行于Raspberry Pi或Arduino这些广泛使用且价格低廉的平台上,具体内容如表1所示。
表1
本书涉及的软件/硬件 操 作 系 统
Docker(https://www.docker.com/products/docker-desktop) ? 64位Microsoft Windows 10专业版或企业版
? macOS 10.13或更新的版本
? Ubuntu Linux 16.04或更新的版本
? Debian Linux Stretch(9)或Buster(10)
? Fedora Linux 30或更新的版本
QEMU(https://www.qemu.org/download/) ? Windows 8或更新的版本(32位或64位)
? macOS 10.7或更新的版本
? Linux(各个版本)
Raspberry Pi 3 Model B
Arduino UNO R3或ELEGOO UNO R3
如果读者正在阅读本书的电子版,建议输入代码或通过GitHub存储库查看代码,这有助于防止代码复制、粘贴过程中出现的潜在错误。
下载示例代码文件
读者可访问www.packt.com并通过个人账户下载本书的示例代码文件。无论读者在何处购买了本书,均可访问www.packt.com/support,经注册后我们会直接将相关文件通过电子邮件的方式发送给您。
下载代码文件的具体操作步骤如下。
(1)访问www.packt.com并注册。
(2)选择Support选项卡。
(3)单击Code Downloads。
(4)在Search搜索框中输入书名。
当文件下载完毕后,可利用下列软件的版本解压或析取文件夹中的内容。
? WinRAR/7-Zip(Windows环境)。
? Zipeg/iZip/UnRarX(Mac环境)。
? 7-Zip/PeaZip(Linux环境)。
另外,本书的代码包也托管于GitHub上,对应网址为https://github.com/PacktPublishing/ Embedded-Programming-with-Modern-CPP-Cookbook。若代码被更新,现有的GitHub库也会保持同步更新。
读者还可访问https://github.com/PacktPublishing/并从对应分类中查看其他代码包和视频内容。
下载彩色图像
我们还进一步提供了本书中截图/图表的彩色图像,读者可访问https://static.packt-cdn. com/downloads/9781838821043_ColorImages.pdf进行查看。
图标表示警告或重要的注意事项。
图标表示提示信息和操作技巧。

读者反馈和客户支持
欢迎读者对本书提出建议或意见并予以反馈。
对此,读者可向customercare@packtpub.com发送邮件,并以书名作为邮件标题。
勘误表
尽管我们希望将本书做到尽善尽美,但疏漏依然在所难免。如果读者发现谬误,无论是文字错误或是代码错误,还望不吝赐教。对此,读者可访问http://www.packtpub.com/ submit-errata,选取对应书籍,输入并提交相关问题的详细内容。
版权须知
一直以来,互联网上的版权问题从未间断,Packt出版社对此类问题异常重视。若读者在互联网上发现本书任意形式的副本,请告知我们网络地址或网站名称,我们将对此予以处理。关于盗版问题,读者可发送邮件至copyright@packtpub.com。
若读者针对某项技术具有专家级的见解,抑或计划撰写书籍或完善某部著作的出版工作,可访问authors.packtpub.com。
问题解答
若读者对本书有任何疑问,可发送邮件至questions@packtpub.com,我们将竭诚为您服务。

🚀一、C++嵌入式开发实例精解

本文送出的书籍是这本:

在这里插入图片描述

🔎1.编辑推荐

随着硬件开发的不断进步,越来越多的嵌入式系统由廉价而强大的系统芯片驱动,甚至能够运行通用的多任务系统,如Linux。不断增长的硬件能力需要我们编写更加复杂的软件,因此,C 越来越多地成为新的嵌入式系统的语言。C 允许开发人员创建使用计算和内存资源的应用程序,就像使用C语言编写的应用程序一样,但为开发人员提供了更多的工具处理复杂性和更安全的资源管理问题,如面向对象编程和RAII习惯用法。

🔎2.内容简介

本书详细阐述了与C 嵌入式开发相关的基本解决方案,主要包括嵌入式系统的基础知识,配置开发环境,与不同的体系结构协同工作,处理中断,调试、日志和分析,内存管理,多线程和同步机制,通信和序列化,外围设备,降低功耗,时间点和时间间隔,错误处理和容错机制,实时系统、安全性系统的指导原则,微控制器编程等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。## 🔎3.作者简介

🔎4.产品特色

在这里插入图片描述

🔎5.目录

1章  嵌入式系统的基础知识 1
1.1  考查嵌入式系统 1
1.1.1  与台式机或Web应用程序的不同之处 1
1.1.2  嵌入式系统的类型 2
1.1.3  微控制器 2
1.1.4  片上系统 3
1.1.5  专用集成电路 4
1.1.6  现场可编程门阵列 4
1.2  与有限的资源协同工作 4
1.3  考查性能影响 4
1.4  与不同的架构协同工作 5
1.4.1  字节顺序 5
1.4.2  对齐问题 7
1.4.3  定宽整数类型 8
1.5  处理硬件错误 8
1.5.1  硬件的早期版本 8
1.5.2  硬件的不可靠性 9
1.5.3  环境条件的影响 9
1.6  C 嵌入式开发 9
1.6.1  不必为无用的事务付诸实践 10
1.6.2  基于面向对象编程的代码复杂度计算 12
1.6.3  资源获取时即初始化 12
1.6.4  异常机制 14
1.6.5  强大的标准库 16
1.6.6  线程和内存模型 16
1.7  远程部署软件 17
1.8  远程运行软件 18
1.9  日志和诊断 18
1.10  本章小结 192章  配置开发环境 21
2.1Docker容器中配置构建系统 22
2.1.1  实现方式 22
2.1.2  工作方式 23
2.1.3  更多内容 24
2.2  与模拟器协同工作 24
2.2.1  实现方式 25
2.2.2  工作方式 25
2.2.3  更多内容 27
2.3  交叉编译 27
2.3.1  准备工作 27
2.3.2  实现方式 27
2.3.3  工作方式 28
2.3.4  更多内容 31
2.4  连接至嵌入式系统 31
2.4.1  准备工作 31
2.4.2  实现方式 31
2.4.3  工作方式 32
2.4.4  更多内容 33
2.5  调试嵌入式应用程序 34
2.5.1  准备工作 34
2.5.2  实现方式 34
2.5.3  工作方式 35
2.5.4  更多内容 36
2.6  针对远程调试使用gdbserver 37
2.6.1  准备工作 37
2.6.2  实现方式 37
2.6.3  工作方式 38
2.6.4  更多内容 39
2.7  使用CMake作为构建系统 40
2.7.1  准备工作 40
2.7.2  实现方式 40
2.7.3  工作方式 41
2.7.4  更多内容 443章  与不同的体系结构协同工作 45
3.1  定宽整数类型 45
3.1.1  实现方式 46
3.1.2  工作方式 47
3.1.3  更多内容 48
3.2  处理size_t类型 48
3.2.1  实现方式 48
3.2.2  工作方式 49
3.2.3  更多内容 50
3.3  检测平台的字节顺序 50
3.3.1  实现方式 51
3.3.2  工作方式 52
3.3.3  更多内容 53
3.4  转换字节顺序 53
3.4.1  实现方式 54
3.4.2  工作方式 57
3.5  处理数据对齐问题 58
3.5.1  实现方式 59
3.5.2  工作方式 60
3.5.3  更多内容 61
3.6  处理打包结构 61
3.6.1  实现方式 62
3.6.2  工作方式 62
3.6.3  更多内容 63
3.7  缓存行对齐数据 63
3.7.1  实现方式 63
3.7.2  工作方式 65
3.7.3  更多内容 664章  处理中断 67
4.1  数据轮询 67
4.2  中断服务程序 68
4.3  对ISR的一般考虑 68
4.4  8051微控制器中断 69
4.5  实现中断服务程序 70
4.5.1  实现方式 70
4.5.2  工作方式 72
4.6  通过8位自动重载模式生成一个5 kHz的方波信号 73
4.6.1  实现方式 74
4.6.2  工作方式 75
4.7  使用Timer 1作为事件计数器计数一个1 Hz脉冲 76
4.7.1  实现方式 76
4.7.2  工作方式 78
4.7.3  更多内容 79
4.8  串行接收和传输数据 79
4.8.1  实现方式 80
4.8.2  工作方式 80
4.8.3  更多内容 815章  调试、日志和分析 83
5.1  技术需求 83
5.2  在GDB中运行源程序 84
5.2.1  实现方式 84
5.2.2  工作方式 86
5.2.3  更多内容 90
5.3  处理断点 91
5.3.1  实现方式 91
5.3.2  工作方式 92
5.3.3  更多内容 96
5.4  处理核心转储 96
5.4.1  实现方式 96
5.4.2  工作方式 97
5.4.3  更多内容 99
5.5  使用gdbserver进行调试 99
5.5.1  准备工作 100
5.5.2  实现方式 100
5.5.3  工作方式 100
5.6  添加调试日志机制 101
5.6.1  实现方式 101
5.6.2  工作方式 102
5.6.3  更多内容 104
5.7  与调试和发布版本协同工作 104
5.7.1  实现方式 105
5.7.2  工作方式 106
5.7.3  更多内容 1086章  内存管理 109
6.1  使用动态内存分配 109
6.1.1  实现方式 110
6.1.2  工作方式 112
6.2  对象池 112
6.2.1  实现方式 113
6.2.2  工作方式 115
6.2.3  更多内容 118
6.3  环状缓冲区 118
6.3.1  实现方式 119
6.3.2  工作方式 121
6.4  使用共享内存 124
6.4.1  实现方式 125
6.4.2  工作方式 128
6.4.3  更多内容 131
6.5  使用专用内存 131
6.5.1  实现方式 131
6.5.2  工作方式 133
6.5.3  更多内容 1357章  多线程和同步机制 137
7.1  C 语言中的线程支持 137
7.1.1  实现方式 138
7.1.2  工作方式 139
7.2  数据同步机制 140
7.2.1  实现方式 140
7.2.2  工作方式 141
7.2.3  更多内容 143
7.3  使用条件变量 143
7.3.1  实现方式 143
7.3.2  工作方式 145
7.3.3  更多内容 147
7.4  使用原子变量 147
7.4.1  实现方式 148
7.4.2  工作方式 150
7.4.3  更多内容 151
7.5  使用C 内存模型 152
7.5.1  实现方式 152
7.5.2  工作方式 154
7.5.3  更多内容 155
7.6  无锁同步机制 155
7.6.1  实现方式 155
7.6.2  工作方式 157
7.6.3  更多内容 158
7.7  在共享内存中使用原子变量 159
7.7.1  实现方式 159
7.7.2  工作方式 162
7.8  异步函数和特性 164
7.8.1  实现方式 165
7.8.2  工作方式 166
7.8.3  更多内容 1688章  通信和序列化 169
8.1  在应用程序中使用进程间的通信 169
8.1.1  实现方式 170
8.1.2  工作方式 172
8.1.3  更多内容 175
8.2  进程间的通信机制 175
8.2.1  准备工作 175
8.2.2  实现方式 176
8.2.3  工作方式 177
8.2.4  更多内容 178
8.3  消息队列和发布者-订阅者模式 178
8.3.1  实现方式 179
8.3.2  工作方式 182
8.3.3  更多内容 184
8.4  针对回调使用C lambda函数 185
8.4.1  实现方式 185
8.4.2  工作方式 186
8.4.3  更多内容 187
8.5  数据序列化 187
8.5.1  实现过程 188
8.5.2  工作方式 190
8.5.3  更多内容 191
8.6  使用FlatBuffers192
8.6.1  实现方式 192
8.6.2  工作方式 194
8.6.3  更多内容 1959章  外围设备 197
9.1  控制通过GPIO连接的设备 197
9.1.1  实现方式 197
9.1.2  工作方式 199
9.2  脉冲宽度调制 201
9.2.1  实现方式 201
9.2.2  工作方式 203
9.2.3  更多内容 204
9.3Linux中使用ioctl访问实时时钟 204
9.3.1  实现方式 205
9.3.2  工作方式 207
9.3.3  更多内容 208
9.4  使用libgpiod控制GPIO引脚 208
9.4.1  实现方式 209
9.4.2  工作方式 210
9.4.3  更多内容 211
9.5  控制I2C外围设备 211
9.5.1  实现方式 212
9.5.2  工作方式 216
9.5.3  更多内容 21910章  降低功耗 221
10.1  技术需求 221
10.2  考查Linux中的节能模式 221
10.2.1  实现方式 222
10.2.2  工作方式 223
10.2.3  更多内容 224
10.3  利用RTC进行唤醒 224
10.3.1  实现方式 224
10.3.2  工作方式 225
10.3.3  更多内容 226
10.4  控制USB设备的自动挂起 226
10.4.1  实现方式 226
10.4.2  工作方式 227
10.4.3  更多内容 229
10.5  配置CPU频率 230
10.5.1  实现方式 230
10.5.2  工作方式 231
10.5.3  更多内容 235
10.6  等待事件 235
10.6.1  实现方式 235
10.6.2  工作方式 238
10.6.3  更多内容 241
10.7  利用PowerTOP分析功耗 241
10.7.1  实现方式 241
10.7.2  工作方式 242
10.7.3  更多内容 24411章  时间点和时间间隔 245
11.1  C Chrono245
11.1.1  实现方式 245
11.1.2  工作方式 246
11.1.3  更多内容 247
11.2  测量时间间隔 247
11.2.1  实现方式 248
11.2.2  工作方式 249
11.2.3  更多内容 250
11.3  处理延迟问题 250
11.3.1  实现方式 250
11.3.2  工作方式 252
11.3.3  更多内容 253
11.4  使用单调递增时钟 254
11.4.1  实现方式 254
11.4.2  工作方式 256
11.4.3  更多内容 257
11.5  使用POSIX时间戳 258
11.5.1  实现方式 258
11.5.2  工作方式 259
11.5.3  更多内容 26012章  错误处理和容错机制 261
12.1  处理错误代码 261
12.1.1  实现方式 261
12.1.2  工作方式 264
12.1.3  更多内容 265
12.2  针对错误处理使用异常 265
12.2.1  实现方式 266
12.2.2  工作方式 267
12.2.3  更多内容 269
12.3  捕捉异常时使用常量引用 269
12.3.1  实现方式 269
12.3.2  工作方式 271
12.3.3  更多内容 272
12.4  处理静态对象 273
12.4.1  实现方式 273
12.4.2  工作方式 275
12.5  与定时器协同工作 276
12.5.1  实现方式 277
12.5.2  工作方式 278
12.6  高可用系统的心跳信号 280
12.6.1  实现方式 280
12.6.2  工作方式 283
12.6.3  更多内容 287
12.7  实现软件反抖动逻辑 287
12.7.1  实现方式 287
12.7.2  工作方式 28913章  实时系统 291
13.1  使用Linux中的实时调度器 291
13.1.1  实现方式 292
13.1.2  工作方式 293
13.2  使用静态分配的内存 295
13.2.1  实现方式 295
13.2.2  工作方式 297
13.2.3  更多内容 298
13.3  避免错误处理异常 298
13.3.1  实现方式 299
13.3.2  工作方式 301
13.3.3  更多内容 302
13.4  实时系统 302
13.4.1  实现方式 302
13.4.2  工作方式 303
13.4.3  更多内容 30414章  安全性系统的指导原则 305
14.1  使用全部函数的返回值 305
14.1.1  实现方式 306
14.1.2  工作方式 308
14.1.3  更多内容 310
14.2  使用静态代码分析器 310
14.2.1  实现方式 311
14.2.2  工作方式 311
14.2.3  更多内容 312
14.3  使用前置条件和后置条件 312
14.3.1  实现方式 313
14.3.2  工作方式 314
14.3.3  更多内容 316
14.4  代码正确性的正规验证方案 316
14.4.1  实现方式 316
14.4.2  工作方式 317
14.4.3  更多内容 31915章  微控制器编程 321
15.1  设置开发环境 321
15.1.1  实现方式 321
15.1.2  工作方式 322
15.1.3  更多内容 323
15.2  编译并上传程序 323
15.2.1  实现方式 323
15.2.2  工作方式 323
15.2.3  更多内容 325
15.3  调试微控制器代码 326
15.3.1  实现方式 326
15.3.2  工作方式 327

需要完全了解本书可以看下面:

直达京东购买链接🔗:购买地址《C++嵌入式开发实例精解》


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚公搬代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值