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

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)

大家都在看

  • How to show or hide views within a layout

    Android programming: mode selection and switching using a single activity, Show or hide vi…

    Linux 2023年6月13日
    080
  • Linux磁盘管理

    一、磁盘管理 Linux 磁盘管理好坏直接关系到整个系统的性能问题。 Linux 磁盘管理常用的三个命令为 df、 du 和 fdisk。 df(英文全称:disk full):列…

    Linux 2023年5月27日
    0100
  • iostream 未完

    声明控制从标准流读取和写入到标准流的对象。 通常是唯一需要从 C++ 程序执行输入和输出的标头。 #include <iostream></iostream&gt…

    Linux 2023年6月7日
    070
  • CPU架构对redis的性能影响

    CPU架构对redis的性能影响 主流CPU架构 一个CPU处理器中通常有多个运行核心,每一个运行核心称为一个物理核,每个物理核都可以运行应用程序。每个物理核都拥有 私有的一级缓存…

    Linux 2023年5月28日
    0113
  • laravel源码分析-队列Queue

    队列 (Queue) 是 laravel 中比较常用的一个功能,队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和响应的时间。本文我们就来分析下队列创建…

    Linux 2023年6月7日
    080
  • Java动态脚本Groovy获取Bean(奇淫技巧操作)

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 背景: 在Java代码中当我们需要一个Bean对象,通常会使用spring中@Autowired注解,用来自动装配…

    Linux 2023年6月14日
    0109
  • 笔记:linux 总结

    1.开始 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和…

    Linux 2023年6月14日
    0105
  • 配置免密登陆服务器

    前言 原来自己学习的时候在阿里云买自己的学习机,一台主机自己瞎折腾。但是参加工作以后管理的主机越来越多了,上服务器看的频率也越来越频繁,虽然有时候shell管理工具可以很方便的保存…

    Linux 2023年6月14日
    093
  • QT和Java的跨平台

    大家基本上都知道QT是跨平台的,Java也是跨平台的,那咱们今天就来聊聊他们两个: 相同点:都是跨平台 不同点:Java 的运行是建立在虚拟机上的,在虚拟机上 一次编译到处运行,但…

    Linux 2023年6月13日
    0101
  • 【原创】linux设备模型之kset/kobj/ktype分析

    背 景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. &#8211…

    Linux 2023年6月8日
    0112
  • 基于eNSP的NAT/NAPT协议仿真实践

    一. 基本原理 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的、可扩展的、图形化 操作的网络仿真工具平台,主要对企业网络…

    Linux 2023年6月8日
    088
  • 【docker】python: can’t open file ‘helloworld.py’: [Errno 13] Permission denied

    运行容器提示权限问题 docker run -v $PWD/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python hel…

    Linux 2023年6月7日
    0111
  • 计算机网络通信

    早期:联机 以太网:局域网与交换机 广播 主机之间”一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息…

    Linux 2023年6月14日
    099
  • Docker安装Portainer

    Docker安装Portainer Docker介绍 Docker是一个开源的容器引擎,完全使用沙箱机制,相互之间不会有任何接口,并且容器性能开销低,让开发者可以打包应用或者依赖包…

    Linux 2023年6月6日
    0125
  • centos7 安装MariaDB 10.6

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 背景 centos7使用yum install mariadb-server命令安装的默认版本是5.5的,这是因为系统默认源只有…

    Linux 2023年5月27日
    0375
  • vue3中iview框架初始值赋值问题

    问题:今天有个小伙伴说我们前端有个页面异常奇怪,没有显示数据。 开发小伙伴进行查询之后(非专业前端),明明进行了绑定,页面死活无法渲染,归属于灵异事件了,对于这种灵异事件,我总会想…

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