0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是架构设计 如何进行架构设计

multisim 来源:IOT物联网小镇 作者:IOT物联网小镇 2021-08-16 10:26 次阅读

这可能是一个有争议的话题,到底需不需要,还是要结合实际情况。

什么是架构设计

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.系统架构图

85b8d3ba-fdb6-11eb-9bcf-12bb97331649.png

4.目录结构 Makefile: 编译脚本 application: 业务层 module: 功能模块层 driver: 硬件驱动层 5.执行序列演示 图中橙色的箭头,表示从云端发来一个控制指令。 业务层接收到指令后,解析指令,发送给 Control 模块。 Control 模块再次解析具体的指令,发送给 ZigBee 设备,同时记录到日志中。

85b8d3ba-fdb6-11eb-9bcf-12bb97331649.png

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288345
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3427

    浏览量

    128213
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206724

原文标题:嵌入式开发需要架构设计吗?

文章出处:【微信号:A1411464185,微信公众号:multisim】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    软件架构设计教程

    软件架构设计教程
    发表于 09-26 15:27

    汽车电子电气架构设计及优化措施

    的工具用科学合理的工具来优化汽车设计,并有效达到开发出新型电子电气架构的目的。因此,汽车生产商需要在电子电气架构设计的基础上进行相应的系统优化工作,从而使得汽车的架构设计更加先进与成熟
    发表于 10-18 22:10

    【汽车电气架构设计软件】

    因工作需要,求整车电气架构设计软件——PREEvision(盗版),价格可议,WetChat/***,非诚勿扰
    发表于 04-18 14:20

    【设计技巧】FPGA架构设计漫谈

    /u/97edd21e88(一)流驱动和调用式架构设计是每个FPGA工程师都要面临的第一关。经常有这样的项目,需求分析,架构设计匆匆忙忙,号称一两个月开发完毕,实际上维护项目就花了一年半时间。主要包括
    发表于 08-02 08:30

    STM32软件架构设计的意义

    STM32软件架构1、架构设计的意义(1)应用代码逻辑清晰,且避免代码冗余;(2)代码通用性,方便软件高速、有效的移植;(3)各功能独立,低耦合高内聚;2、总体架构图3、结构层说明4、遵循规则5、优劣评估6、STM32实例说明
    发表于 08-04 07:23

    为何要进行嵌入式软件架构设计?如何设计?

    为何要进行嵌入式软件架构设计?如何进行嵌入式软件架构设计?
    发表于 11-01 06:31

    对嵌入式系统中的架构设计的理解

    【阅读这篇文章,你能了解到什么】1. 从事嵌入式开发12年的我,对架构设计的理解;2. 对嵌入式系统中的架构设计要刻意训练;3. 嵌入式系统开发过程中的一些小技巧;4. 一个用于智能家居项目
    发表于 11-08 08:23

    软件架构设计的三个维度

    架构设计是一个非常大的话题,不管写几篇文章,接触到的始终只是冰山一角,更多的是实践中去体会。这篇文章主要介绍面向对象OO、面向方面AOP和面向服务SOA这三个要素在架构设计中
    发表于 06-22 10:09 1327次阅读
    软件<b class='flag-5'>架构设</b>计的三个维度

    如何使用Autosar的进行整车电子电气架构设计详细方法概述

    PREEvision工具完成架构设计;并且建立架构多维度评估模型、对架构设计方案进行评估选择。最后利用仿真模拟器dSpace对架构
    发表于 11-01 08:00 43次下载
    如何使用Autosar的<b class='flag-5'>进行</b>整车电子电气<b class='flag-5'>架构设</b>计详细方法概述

    系统架构设计的详细讲解

    上一篇,我们讨论了故障度量和安全机制的ASIL等级。本篇我们来聊一聊系统架构设计相关内容。01系统架构设计和TSC当我们开始写TSC时,会涉及到下图中一系列的内容:当我们完成前三期(链接见文末)提到的安全机制规范后,我们就要开始整理好所有的安全需求并在系统
    的头像 发表于 12-24 14:33 1397次阅读

    SWE.2的软件架构设

    过程ID:SWE.2 过程名称:软件架构设计 过程目的:软件架构设计过程目的是建立一个架构设计,识别哪些软件需求应该分配给软件的哪些要素,并根据已定义的标准评估软件架构设计。   过程
    的头像 发表于 01-11 10:36 2440次阅读

    SYS.3的系统架构设

    系统架构设计 过程ID:SYS.3 过程名称:系统架构设计   过程目的:系统架构设计过程目的,是建立系统架构设计,并确定将哪些系统需求分配给系统的哪些要素,以及根据已定义的准则评估系
    的头像 发表于 02-13 16:02 2361次阅读

    架构与微架构设

    下面将从芯片的架构设计、微架构设计、使用设计文档、设计分区、时钟域和时钟组、架构调整与性能改进、处理器微架构设计策略等角度进行说明,并以视频
    的头像 发表于 05-08 10:42 860次阅读
    <b class='flag-5'>架构</b>与微<b class='flag-5'>架构设</b>计

    SWE.2软件架构设

    过程ID : SWE.2 过程名称 : 软件架构设计 过程目的 : 软件架构设计过程目的是建立一个架构设计,识别哪些软件需求应该分配给软件的哪些要素,并根据已定义的标准评估软件架构设
    的头像 发表于 08-24 09:43 498次阅读

    交换芯片架构设

    交换芯片架构设计是网络通信中的关键环节,它决定了交换机的性能、功能和扩展性。
    的头像 发表于 03-18 14:12 195次阅读