在软件行业,模块化编程早已深入人心,通过模块的划分能有效地减小软件系统的复杂度,模块化其实就是将系统“分而治之”的方法。在嵌入式系统中,每一个模块存在初始化函数相对比较的普遍,但是并不是每一个模块都存在一个终止化函数,相反,有可能整个系统根本就没有终止化函数。之所以出现这种现象,这与嵌入式系统的特点有关。与桌面系统上的软件不同的是,由于整个嵌入式设备就只有一个应用软件在运行,因此,对软件的关闭或重启大都是通过开、关设备电源或按下重启按钮这种“粗暴的”方式来完成的。久而久之大家都就习惯了,进而将设计模块的终止化函数当作了多余。

从完整性的角度来看,一个模块如果存在初始化的过程,就理应提供终止化函数以实现模块的终止,当然设计终止化函数不应当只是为了感觉更好,而应当还有其它的目的和内涵,那是什么呢?为每一个模块设计终止化函数的目的是为了提供一种“优雅地”关机或重启系统的手段,而其进一步的内涵是,通过这种方式将提供一个检测系统资源泄漏的机会。

现在,让我们以内存资源为例来分析采用优雅关机的好处。在嵌入式系统中,由于不考虑各模块终止化函数的设计,造成从堆中分配出来的具有全局生命周期的内存在系统系统关闭时不存在释放操作。如此一来,在系统的关闭过程中不容易发现内存泄露问题,因为分不清哪些内存是系统运行期间必须永久持有的(即非内存泄漏),哪些又是动态分配但没有释放的(即内存泄漏)。假设使用内存的每个模块都提供了终止化函数,且系统提供一种方式(比如通过命令行)以触发优雅关机流程,其结果就是导致每一个模块的终止化函数被有序地调用。显然,那些具有全局生命周期的内存在每一个模块的终止化函数中都应进行释放操作,最终在优雅关机的过程中也会被释放。进一步,在内存管理模块的终止化函数中(注意:前面讲的是使用内存的模块,而现在讲的是管理内存的模块),可以设计成检测当前是否仍有内存被分配出去了,如果有,则很有可能存在内存泄漏。如果内存管理模块被设计成能记录所有已分配出去内存的详细信息的话(指内存的分配是在哪一个文件的哪一行),在发现仍有内存没有释放的话,将这些相关信息通过某种方式输出将有助于发现内存泄漏点。当然,这里有一个很重要的前提假设,那就是在优雅关机的过程中使用内存的模块的终止化函数必须在内存管理模块的终止化函数之前被调用,这一点可以通过一定的模块管理轻松做到。

内存资源可以通过优雅关机的方式发现泄漏,其它的资源同样可以采用这一方法发现泄漏。比如,在定时器管理模块的终止化函数中可以检查是否所有的定时器都已回收了,等等。有了优雅关机的方式以后,并不妨碍我们采用“粗暴的”方式进行系统的关闭或重启,但它的存在却提供了一种需要时能被使用以辅助发现潜在的资源泄漏问题。

设计模块的终止化函数需要一点工作量,但这点工作量是可以承受的,而且也应当承担它。与潜在的资源泄漏相比,花上这些时间是值得的。另外,设计得好的系统,不只是简单地提供初始化和终止化函数,还应当站在整个系统的角度设计一定的机制去管理系统中模块的初始化和终止化。

[设计原则] 为模块设计初始化和终止化函数相关推荐

  1. 面向对象的设计原则-类设计原则

    面向对象的设计原则-类设计原则 排行榜 收藏 打印 发给朋友 举报发布者:七月十五 热度票  浏览1368次 [共4条评论][我要评论]时间:2008年11月08日 10:55 在面向对象设计中,如何 ...

  2. BetaFlight深入传感设计:传感模块设计框架

    BetaFlight深入传感设计:传感模块设计框架 1. BetaFlight传感器简介 2. BetaFlight传感器嵌入式软件设计 3. HwPreInit/HwInit阶段 4. HwIo阶段 ...

  3. 商场计算机管理系统,计算机专业毕业论文商场管理系统—数据库设计及人事管理模块设计.doc...

    韶 关 学 院 毕 业 设 计 题 目:商场管理系统 -数据库设计及人事管理模块设计 学生姓名:xx 学 号:xx 系 (院):计算机科学系 专 业:计算机科学与技术 班 级:04级本(2)班 指导教 ...

  4. 设计模式---(设计原则)面向对象设计原则

    1 开闭原则 开闭原则:一个软件实体应当对扩展开放,对修改关闭. 在设计一个模块的时候,应当是这个模块可以再不被修改的前提下被扩展,换句话说就是,应当可以再不必修改源代码的情况下改变这个模块的行为. ...

  5. solid 设计原则 php,面向对象设计SOLID五大原则

    今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是: S = 单一 ...

  6. 浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开

    我们工作中一直强调要做架构设计.系分,最近前端同学在追求前端质量提升的时候,也在进行架构设计.前端系分的推广,那到底什么是架构设计和系分?该怎么做架构设计和系分?本文尝试对架构设计进行全面的介绍和分享 ...

  7. 设计原则与思想:设计原则

    这里写目录标题 理论一:对于单一职责原则,如何判断某个类的职责是否够单一 理论二:如何做到"对扩展开放,修改关闭?扩展和修改各指什么?" 理论三:里式替换(LSP)跟多态有何区别? ...

  8. 代码设计的基础原则_设计原则:良好设计的基础

    代码设计的基础原则 As designers, it's our goal to pass information in the most pleasing way possible. Startin ...

  9. STOpen硬件设计4-周边模块设计二(CAN+RS485+UART+IO扩展等)

    本章继续设计剩余的模块,完成一个基本系统的设计工作,然后就可以开始软件工作了: 一个调试UART,一个输出UART UART的设计相对比较简单,把RX,TX直接连接到需要输出的插座就可以.在本项目设计 ...

  10. 图标设计原则_图标设计的7个原则

    图标设计原则 重点 (Top highlight) More in the iconography series:• Foundations of Iconography• 5 Ways to Cre ...

最新文章

  1. 你不得不会的MarkDown--手把手教你掌握MarkDown
  2. 一次授权测试引起的全域名沦陷
  3. dotnetcore+vue+elementUI 前后端分离 三(前端篇)
  4. C++重载IO操作符
  5. FR帧中继(点对点子接口)
  6. java org.jsoup does not exist_java使用Jsoup连接网站超时的解决方法
  7. linux多线程入库hive,hiveserver2 定时挂采坑记
  8. css px转rem工具,支持生产整个css文件统一修改
  9. VB语言实现Http的Post和Get请求
  10. 嵌入式行业需要什么样的技术人才?
  11. 用户界面组件-菜单(Menus)
  12. “狂徒”富豪严介和经典语摘
  13. TSINGSEE青犀视频云-边-端架构视频智能分析平台EasyNVR如何实现直播地址和录像地址统一
  14. 自动刷新网页,自动刷新当前页面,JS调用
  15. 神经网络方法研究及应用,基于神经网络的控制
  16. 只因女婿是VB程序员,刚见面就被未来岳父轰出家门
  17. 联合利华营销||轻扬是如何突出重围做到无懈可击的?
  18. java 当天最晚时间毫秒_java 日期和字符串互转,根据当天整天时间 得到当天最后一秒的日期时间...
  19. AS608光学指纹识别模块 智能锁/考勤门禁开发/指纹采集模块
  20. 远程视频会议系统/视频调度指挥平台/音视频通话系统EasyRTC在应急指挥领域中的应用

热门文章

  1. Spark之键值RDD转换(转载)
  2. MVC保存二进制到数据库,并显示文件的方法(图片显示)
  3. 去掉输入法上的CH和EN
  4. 在SQLServer2005中使用全文搜索
  5. oracle sql 字段行转列
  6. 在 Visual Studio Code 中使用 PoweShell - CodeShell
  7. GoldenGate碎碎念
  8. Python urllib2 设置超时时间并处理超时异常
  9. asp.net中使用下拉菜单的级联问题
  10. 强烈推荐Seam实战