嵌入式软件架构设计-模块化

1 前言

模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。

比如搭积木,可以用一个个积木模块组合成我们想要的任何样子,而且通过使用相同的积木模块组合成不同的样子

2 为何模块化

为什么要模块化程序设计?那就需要从程序模块化的好处说起!只有了解了其优点,才能更好的实现模块化编程。

  1. 降低程序设计的复杂度

有利于程序的设计和调试,功能相对独立,结构清晰;主要是封装实现细节,提供使用接口即可

  1. 提供代码的复用性

现成的程序代码,直接移植到另一个项目中简单修改甚至不用修改就能使用,多个模块程序组合就完成了一个新的功能;这也是模块化最大的意义所在

  1. 便于功能维护和扩展

一旦出现问题,能迅速定位哪个模块出现的问题

  1. 程序的结构一目了然

可以看出程序中使用了哪些驱动、有哪些外设模块、大概有哪些功能等

  1. 保证系统稳定性

该模块程序已通过之前的项目经过反复验证,稳定性高,在新项目中移植比重写更稳定

  1. 有利于团队开发

各模块之间功能独立,有利于任务分解,团队分工,各自实现对应的功能,并且可以单独进行测试验证

3 如何拆分模块

基本思路是自顶向下、逐步分解、分而治之,即将一个较大的程序按照功能分割成一些小模块;比如手持遥控器,主要功能就是人机交互,可能还会有参数设置等,那么依次往下分解得到以下模块:

嵌入式软件架构设计-模块化

在拆分模块时应该注意以下几个主要原则:

  1. 模块独立

模块的独立性原则表现在模块完成独立的功能,与其他模块的联系应该尽可能得简单,各个模块具有相对的独立性。

  1. 模块的规模要适当

模块的规模不能太大,也不能太小。如果模块的功能太强,可读性就会较差,若模块的功能太弱,就会有很多的接口。开发者需要通过较多的程序设计来进行经验的积累。

  1. 分解模块时要注意层次

在进行多层次任务分解时,要注意对问题进行抽象化。在分解初期,可以只考虑大的模块,在中期,再逐步进行细化,分解成较小的模块进行设计。

  1. 不对外开放全局变量

模块内部使用的全局变量,需要外部修改或者获取时,需要通过封装成 API 函数对外提供,同时可以在函数内有相关限制,防止外部直接操作模块内部的全局变量引发模块运行异常,因此模块内部的全局变量可定义为静态全局变量。

4 如何理解

通常一个模块就是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明

  1. 该模块的.c文件实现具体功能,而.h文件则为该功能模块的接口函数等
  2. 一个大模块中也会存在多个小模块,即模块中存在多个.c和.h文件,每个.c和.h作用各不相同
  3. 一个.c 文件必须一个对应的.h文件,而.h文件不一定需要对应的.c 文件

比如实现一个OLED驱动模块,可能会有以下的文件:

  • oled.c 和 oled.h

实现具体功能,如清屏、画图、字符显示等;.h 文件对外提供 API 接口函数

  • oledio.c 和 oledio.h

实现底层接口初始化和通信(IIC或SPI),为oled.c文件提供驱动接口

  • oledconf.c 和 oledconf.h

驱动配置, 如字体大小、分辨率等配置信息

  • fontxxx.h 和 bmpxxx.h

用来存放字体和BMP图形点阵数据

Original: https://www.cnblogs.com/const-zpc/p/16364439.html
Author: 大橙子疯
Title: 嵌入式软件架构设计-模块化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581960/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析

    Cisco GNS3 IPv6 6rd实验 1、回顾 前文:https://www.cnblogs.com/kingpop/p/14054321.html在描述Cisco GNS3…

    Linux 2023年6月6日
    087
  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年6月13日
    095
  • linux下启动MongoDB权限不够

    bash: ./mongod: 权限不够 解决办法: 在MongoDB安装目录下: chmod -R 740 bin Original: https://www.cnblogs.c…

    Linux 2023年6月14日
    080
  • MySQL之变量

    mysql变量分类: 系统变量:系统自带的变量 状态变量:用于设置或保存系统的运行状态 用户自定义变量:用户自定义的变量 系统变量 使用@@标识一个系统变量,系统变量分为全局(gl…

    Linux 2023年6月7日
    0102
  • STP 指定端口 根端口 区别和理解

    不多说,先上图,A为指定端口,B为非指定端口。 看本文的网友应该知道根端口和指定端口的选举,但是对指定端口和根端口的理解不清楚。这里我就略过选举过程,直接描述这两者的区别和存在的意…

    Linux 2023年6月6日
    0136
  • Xshell中文乱码问题

    先查看当前使用的语言: echo $LANG 查看系统的语言安装包: locale 如果没有中文安装包(包含zh_CN字样),需要网络或者自己上传安装包,安装 有了中文语言安装包后…

    Linux 2023年5月28日
    085
  • LeetCode-26. 删除有序数组中的重复项

    题目来源 题目详情 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应…

    Linux 2023年6月7日
    087
  • 剪贴板被占用导致应用使用剪贴板拷贝内容失败抛出 COMException 0x800401D0 错误

    本文记录某些软件,例如 向日葵远程控制 软件占用剪贴板,导致 WPF 应用使用剪贴板拷贝内容和设置剪贴板时,抛出 System.Runtime.InteropServices.CO…

    Linux 2023年6月6日
    0126
  • MySQL8主从复制

    环境介绍 主服务器配置 修改my.cnf配置文件 在/etc/my.cnf 添加如下信息 登录主服务器给从服务器授权 登陆mysql 创建user授权 备注:rootslave就是…

    Linux 2023年6月14日
    0127
  • 剑指offer计划18( 搜索与回溯算法中等)—java

    1.1、题目1 剑指 Offer 55 – II. 平衡二叉树 1.2、解法 递归和下一面一题的结合版,abs去绝对值判断两边的差,然后递归isBalanced来遍历二…

    Linux 2023年6月11日
    052
  • [随记]-SpringMVC中的handler到底是什么东西

    HandlerMapping 初始化时候的 HandlerMapping 有,按顺序排列: requestMappingHandlerMapping beanNameHandler…

    Linux 2023年6月6日
    082
  • CentOS 7安装jdk-mysql-nginx

    安装jdk 设置开机自启 重启systemctl Original: https://www.cnblogs.com/nianxue/p/16618805.htmlAuthor: …

    Linux 2023年6月6日
    067
  • java反射机制

    1..获取Class实例的方式 1 @Test 2 public void test3() throws ClassNotFoundException { 3 //方式一:调用运行…

    Linux 2023年6月6日
    0108
  • 错误域控降级导致解析问题

    近两天在给分部安装辅助域控的时候,总是安装不成功,或者安装时成功了但是无法复制主域或者其他域控的信息,同步失败,还有就是它一直没有网。 解决方案 经过排查发现域名dns解析不对,经…

    Linux 2023年6月8日
    0107
  • 虚拟机网络地址配置你不知道的事儿-服务器的种类

    想必大家在初学Linux过程中,应该都是跟我一样白嫖一台虚拟机进行使用把,但是在大家白嫖的同时知不知道我们公司内是使用的什么样的服务器呢?公司肯定不会跟我们一样在自己电脑进行安装虚…

    Linux 2023年6月14日
    0118
  • linux磁盘配额管理

    磁盘配额是一种磁盘空间的管理机制,使用磁盘配额可限制用户或组在某个特定文件系统中能使用的最大空间 1、查看内核是否支持磁盘配额 grep “CONFIG_QUOTA&#…

    Linux 2023年5月27日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球