书摘:C 嵌入式系统设计模式 04

2024-01-07 01:52

本文主要是介绍书摘:C 嵌入式系统设计模式 04,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。

本系列描述我对书中内容的理解。

  1. 实现类的最简单方法是使用文件作为封装边界:公共变量和函数声明在 .h 文件中,函数实现和私有变量在 .c 文件中。
  2. 一种更灵活的方法是使用文件中的结构体表示类。与结构体位于同一文件中的函数定义类的操作。为了确保函数能够访问正确的对象数据,我们需要传入一个 me 指针。
  3. 在结构体本身中嵌入函数指针,这可以实现子类的继承。

以上就是本书中用 C 语言模拟类的三种方法。这三种方法复杂度逐渐增加,不要因为第一种方法简单就认为它用处不大,不是这样的。实际上,这三种方法在 C 编程中都十分常用,尤其在编写模块化程序时,它们甚至与类无关,只是恰好可以模拟类的行为。

这三种方法都以文件作为封装边界,只是后两种没有明确指出。封装的目的在于降低整体复杂度。在编程界,封装是一种重要的思想。《UNIX 哲学》告诉我们:“要编制复杂软件而又不至于一败涂地的唯一方法就是降低其整体复杂度——用清晰的接口把若干简单的模块组合成一个复杂软件。如此一来,多数问题只会局限于某个局部,那么就还有希望对局部进行改动而不至牵动全身。”

第 1 种方法中将公共变量声明在 .h 文件,我自己并不认同这种方法,我推荐使用函数封装全局变量,对外只提供函数,这实际上对外隐藏了数据,因此封装性更好。此外,这样更灵活,有利于以后的扩展。这怎么理解呢?用函数封装一下后,函数能做的事情,比使用变量要多的多,你可以在函数中轻松的修改或扩展功能,而无需修改使用该函数(原来这里是变量)的所有代码

许久之前,我认为这样影响效率。直到我意识到,我手上的这颗 M3 芯片,1ms 可以执行110000 条单周期指令,或者换句话,1ms 可以执行 220KB 的代码。现代的单片机速度今非昔比了,效率固然重要,但可扩展性有些时候更重要。何况,对现代的编译器来说,用函数封装变量,真的会影响效率吗?还真不一定。

对于第一种方法,我并不赞同将公共变量声明在 .h 文件中。我主张使用函数来封装全局变量,仅对外提供函数接口。这样能更好地隐藏数据,从而提高封装性。此外,这种做法更灵活,有利于未来的扩展。这怎么理解呢?使用函数封装后,函数能做的事情,比变量要多的多。你可以在函数内部轻松地修改或扩展功能,而无需修改使用该函数的所有代码。

许久之前,我认为这样影响效率。直到我意识到,我手上的这颗 M3 芯片,1ms 可以执行110000 条单周期指令,或者换句话,1ms 可以执行 220KB 的代码。时至今日,单片机的速度今非昔比了!效率固然重要,但可扩展性有些时候更重要。何况,对现代的编译器来说,用函数封装变量,真的会影响效率吗?还真不一定。

在标准 C 编程中,复杂的算法仍然可以嵌入类中,但这些类通常是 单例(singletons),这意味着应用程序中只有一个类的 实例(instance)。例如,单例 Printer 类可能具有 currentPrinter 等变量和 print() 等操作,但应用程序只有一个实例。即使只有一个实例在运行,将类使用的数据与作用于该数据上的操作封装在一起仍然是有益的。在其他情况下,通常以数据为中心(与以算法或服务为中心相反)的类会有多个实例。

这段话描述了一些设计模式:单例和多实例。即使不采用面向对象的思想,了解这些知识也是非常重要的。在模块化设计中,我们经常会遇到单一实例模块(single-instance module)和多实例模块(multiple-instance module),它们在封装模块的数据方式上,有着本质的区别。

对于单一实例模块,其数据以静态形式存在于 .c 文件中,并通过 .h 文件中提供的接口来访问这些数据。由于使用了静态数据,这种方法适用于只需要处理一套数据的模块。这种方式简单,简单意味着可靠。

当一个模块要为不同的客户管理不同的数据时,要使用多实例模块。在多实例模块中,必须要初始化数据结构并把它传回给客户以保持其上下文。比如一个环形缓冲区模块。

在面向对象编程中,单例是一种设计模式,其中确保一个类只有一个实例,并提供一个全局访问点来访问该实例。假如 Printer 类是一个单例,这意味着在整个应用程序中,只有一个 Printer 类的实例存在。

类生来具有一些特殊的操作:构造函数和析构函数。

在面向对象编程中,构造函数析构函数 是两个非常重要的成员函数:

  1. 构造函数在创建对象时自动调用,主要作用是初始化对象的成员变量和其他资源。在本书中,构造函数命名为 Xxxx_Init()。此外,在本书中,创建对象的函数命名为 Xxxx_Create(),在这个函数中调用构造函数 Xxxx_Init()
  2. 析构函数在销毁对象时自动调用,主要作用是释放对象所占用的资源,例如内存、文件句柄等,还可以执行一些清理操作,例如关闭文件、断开网络连接等。在本书中,析构函数命名为 Xxxx_Cleanup() 。此外,在本书中,销毁对象的函数命名为 Xxxx_Destroy(),在这个函数中调用析构函数 Xxxx_Cleanup()






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉

这篇关于书摘:C 嵌入式系统设计模式 04的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578352

相关文章

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

TP-LINK/水星和hasivo交换机怎么选? 三款网管交换机系统功能对比

《TP-LINK/水星和hasivo交换机怎么选?三款网管交换机系统功能对比》今天选了三款都是”8+1″的2.5G网管交换机,分别是TP-LINK水星和hasivo交换机,该怎么选呢?这些交换机功... TP-LINK、水星和hasivo这三台交换机都是”8+1″的2.5G网管交换机,我手里的China编程has

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节