嵌入式开发需要架构设计吗?
来源 | IOT物联网小镇
这可能是一个有争议的话题,到底需不需要,还是要结合实际情况。
什么是架构设计
1.架构设计概念的认识
相信看这篇文章的同学,大部分都是从事嵌入式开发的,大家也肯定有这么一个印象:在招聘网站上的一些架构设计的岗位,都是针对 Web 方向的,却很少看到招聘嵌入式岗位的系统架构师的岗位。
我的理解是大概有下面2个原因:
(1) Web开发:百家争鸣,没有统一的标准和老大
这些年得益于移动互联网的发展,前、后端开发岗位的需求量大增,而且各种框架层出不穷。
如何利用这些框架来为用户提供高性能的服务并没有一个统一的标准,于是百家争鸣,相应的设计师岗位也就层出不穷。
(2) 嵌入式开发:Linux 舍我其谁
在嵌入式系统的开发中,在操作系统的选择上几乎没有太大的余地,大部分是 ARM+Linux 组合。
在 Linux 操作系统层面:那些大神们已经把内核和驱动层设计的很完美了,很少需要开发人员做大量的修改。
在应用程序层面:开发人员如果没有什么追求,只为了实现规格书中定义的功能即可。
而老板呢,也只是重视产品功能是否能正常实现,至于什么可移植、可扩展、执行效率等等,不会想到这个层面。
即使产品需要更新换代,让开发人员重新实现即可,反正只需要功能OK就行。
2.嵌入式系统的架构设计重要性
说一个小故事。
有一位同事为客户写一个单片机产品的程序,后来同事离职后把代码移交给我。
这个产品有一个小功能需要修改一下,恰巧那会我正在处理另外一个项目,于是在征得老板许可的情况下把源代码发给客户,请他们自己修改。
因为拿到了源代码,客户肯定很开心啊,因为只要吃透了代码,其他类似的设备都可以自己开发了。
过了一段时间,我问客户:上次那个产品的功能修改怎么样了?
他说:还没搞定呢,上次你给的代码我丢了,会把人看死的,现在正从头重新写代码呢。
故事是真实的。
代码都是字符组成的,有些代码看起来赏心悦目,有些代码看起来怀疑人生。
没有架构设计进行指导的代码,有这些缺点:
(1) 代码不能复用,移植很麻烦。
(2) 当需求发生改动时,不能快速调整代码。
(3) 对于已有的代码:不敢改、不想改,牵一发而动全身。
(4) 调试bug很头疼。
相反的,如果架构设计的好,对各方面都有好处:
对于项目来说:
(1) 项目周期可控
(2) 代码可读性好
(3) 功能可扩展
(4) 修改单一模块不会影响其他功能
(5) 并行开发
(6) 单元测试方便
对于开发人员来说:
(1) 节省开发时间
(2) 全局视角,提高开发大型项目的能力
(3) debug轻松、快速
如何进行架构设计
1.设计文档
只要进入编程领域,大家都知道要高内聚、低耦合,分模块、分层设计。
但是具体需要怎么做?
如何在规定好的项目周期内把事情做好,而且让自己没那么累?
如何为自己后期的维护做好铺垫?
。。。
这些问题可能在项目初期的时候,都规划的比较好。
但是在执行过程中,就会越来越偷懒,越来越偏离预定义的方向。
我的建议是:
无论项目的大小,无论项目周期的长短,一定要有设计文档,设计文档的详细程度就需要根据项目的实际情况进行灵活把握了。
在设计文档中,就要把架构方面的设计体现出来。在实现的过程中,严格按照文档中的要求来做。
取乎其上,得乎其中;取乎其中,得乎其下。
2. 程序文件的物理模型
(1) 分层设计
业务层
功能模块层
驱动层
(2) 分模块设计、
根据功能来划分模块
模块之间通过API接口函数进行数据交互
设计灵活的API接口函数
3. 进程与线程的选择
在嵌入式系统中,实现产品的功能,可以通过多个进程相互配合来完成,也可以用多线程来实现,这个选择没有固定的标准,视项目的具体情况而定。
我一般的做法是:
如果产品功能不复杂,尽量用多线程来实现;
如果产品设计到的功能比较多,那么就把强相关的模块放到独立的进程中。
(1) 使用进程
各模块独立编译,不会相互影响。
出现类似 SegmentFault 问题,很容易定位到肇事者。
方便分布式部署。
代码安全:除了整合人员,其他人只需要 clone 自己负责的模块代码,没有权限、也不需要访问别人的代码。
但是:需要考虑到进程之间的通信问题,比如:IPC调用、socket通信、总线。(我一般都会采用在本地系统内使用一条MQTT总线来挂接所有的通讯模块)
(2) 使用线程
创建线程成本低。
线程之间共享全局变量(换个角度,这也是一种缺点)。
模块之间调用方便,因为函数地址直接可见。
4. API设计
可以把一个模块看成是黑盒,给定一个输入,就会返回确定的结果,或者执行确定的功能,
模块之间只需要定义好这个API接口函数就行。
至于模块内部是如何实现的,大家各显其能。
另外,如果你是API设计人员,一定要注意要让调用者用起来很舒服。就像你递一把剪刀给别人,一定是把手给对方。
另外一个经验,在项目设计初期,尽量不要把API的函数设计的太死板,容易给自己下套。
例如:
(1) 可以设计带有 char *的变量,使用json格式的字符串,来传递任意长度和类型的数据。
(2) 可以设计带有 void *的变量,用来传递任意数据类型的地址,这个功能在很多项目中被使用的出神入化,比如:很早之前高通手机的BREW平台,智能家居中的 ZWave平台。
5. 文件目录的设计
这部分容易理解,职责不同的文件要存放到相应的目录中:头文件、库文件、可执行文件、相关文档。如果这部分组织的不够好,当你把项目移交给其他同事时,肯定会被其他人在心中默念一千遍:F-U-C-K Y-O-U!
6.编译脚本的设计(构建工具)
当我们接到一个嵌入式项目时,在确定方案之后,程序运行的平台都是确定的,大部分情况就是嵌入式Linux,或者是一些变体。
在开发阶段,我见过有些开发人员每调试一个功能点,就把代码交叉编译后放,然后通过NFS远程挂载,或者scp远程拷贝,在真实设备上执行。我看着都比较累。
其实完全可以在编译脚本中为不同的平台编译一个版本。
比如:使用Ubuntu系统来开发产品时,只要x86平台可以模拟产品功能,就直接编译x86版本。
当所有的功能点在x86平台上测试OK了, 再统一放到真实的嵌入式系统中进行联调,这样做能节省很多时间。
Demo说明
1.简介
这个Demo是从一个智能家居项目中抽取出来的,只是体现了各功能模块的设计,函数内部没有实现任何功能,仅仅是用来展示设计的过程。
2.代码获取
https://pan.baidu.com/s/1B3F9byydXeNWdtgYEEQNLg
密码:3a9p
在 Ubuntu16.04 系统下,可以直接编译执行。
3.系统架构图
4.目录结构
Makefile: 编译脚本
application: 业务层
module: 功能模块层
driver: 硬件驱动层
5. 执行序列演示
图中橙色的箭头,表示从云端发来一个控制指令。
业务层接收到指令后,解析指令,发送给 Control 模块。
Control 模块再次解析具体的指令,发送给 ZigBee 设备,同时记录到日志中。
免责声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。
------------ END ------------
●嵌入式专栏精选教程
●精选汇总 | ST工具、下载编程工具
●精选汇总 | 嵌入式软件设计与开发
●精选汇总 | STM32、MCU、单片机
欢迎关注我的公众号,回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
欢迎关注我的视频号:
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。
嵌入式开发需要架构设计吗?相关推荐
- 嵌入式开发的架构设计
[我对架构设计的理解] 1.架构设计概念的认识 相信看这篇文章的同学,大部分都是从事嵌入式开发的,大家也肯定有这么一个印象:在招聘网站上的一些架构设计的岗位,都是针对 Web 方向的,却很少看到招聘嵌 ...
- 三种嵌入式开发程序架构
三种必须掌握的嵌入式开发程序架构 前言 reference 前言 在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题.软件架构对于系统整体的稳定性和可靠性是非常重要的,一 ...
- 短视频开发SDK 架构设计实践
短视频开发SDK 架构设计实践 短视频发展史 图 1 图 1 所示是短视频及直播的发展史,众所周知,2016 年是直播元年,在这期间诞生了很多直播平台,比如熊猫.映客.斗鱼等:而在 2017 年,短视 ...
- 笔记-信息系统开发基础-架构设计-软件架构主要职责
软件架构主要职责 (1)确认需求在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可.架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求. (2)系 ...
- 上位机开发(架构设计)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 和一般的上位机开发相比,固件下载软件的流程是比较简单.清晰的.所谓的架构设计,一般都是从各种业务 ...
- 笔记-信息系统开发基础-架构设计-软件系统架构视图
软件系统架构视图是从特定的视角出发,专注于该视角系统的结构,模块划分,基本组件职责和主要的控制流(协作接口). Kruchten(克鲁奇顿)在1995年提出了一个"4+1"的视图模 ...
- 笔记-信息系统开发基础-架构设计-分布式应用的架构设计问题
针对目前广泛使用的分布式应用,其软件架构设计需要考虑如下问题. (1)数据库的选择问题:目前主流的数据库系统是关系数据库. (2)用户界面选择问题:HTML/HTTP (S)协议是实现 Interne ...
- 笔记-信息系统开发基础-架构设计-软件架构风格
参考<信息系统项目管理师教材(第3版)>P45,软件架构风格,Garlan和Shaw对通用软件架构风格进行了分类,他们将软件架构分为数据流风格.调用/返回风格.独立构件风格.虚拟机风格和仓 ...
- 笔记-信息系统开发基础-架构设计-软件体系结构评估方式
软件体系结构评估方式主要有以下三种: 1.基于调查问卷或检查表的评估方式 调查问卷是一系列可以应用到各种体系结构评估的相关问题,其中有些问题可能涉及到体系结构的设计决策:有些问题涉及到体系结构的文档, ...
最新文章
- TagCloudView云标签的灵活运用
- 一次“失败”的阿里面试之旅
- 使用 Python 进行稳定可靠的文件操作
- poj 2831(次小生成树)
- menu什么意思中文意思_vigorous什么意思
- 前端预览word文件_[装机必备] QuickLook —— 敲击空格即可快速预览文件
- django 不包括字段 序列化器_手写一个Django序列化功能
- 琴岛学院计算机应用技术,我院计算机工程系成功晋级“中国高校计算机大赛-网络技术挑战赛”全国总决赛...
- 2.2 PostgreSQL 概念
- java请求servlet,[Java]Servlet发送Post请求
- html目录清华,清华大学HTML、《网页设计与制作》讲义.ppt
- Python抓取打印机硒鼓和组件剩余量的爬虫
- 如果“定位BUG”有等级的话,你是什么段位?
- 计算机不能代替人类英语,英语作文 谈谈计算机1我们已进入了计算机时代2计算机有许多优点3计算机不能代替人类...
- DinnerNow中的Work Flow应用(下) --- 订单流程
- mysql 自动加上编号
- ArcGIS地理数据处理高级教程_004_1遇到没有地理参照系信息的数据怎么办
- 利用计算机建立动画中的 画面 由,计算机图形术在三维动画中的应用.doc
- SQL回炉重造07_函数
- 读书笔记 | 张五常 经济解释 (卷一) 科学说需求