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

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

3天内不再提示

探究嵌入式开发是否需要架构设计?

GReq_mcu168 来源:CSDN技术社区道哥分享 作者:CSDN技术社区道哥分 2021-04-05 09:49 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

阅读这篇文章,你能了解到什么

1. 从事嵌入式开发12年的我,对架构设计的理解;

2. 对嵌入式系统中的架构设计要刻意训练;

3. 嵌入式系统开发过程中的一些小技巧;

4. 一个用于智能家居项目的Demo,可以直接编译、执行;

我对架构设计的理解

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

pIYBAGBihVqAUJCpAAsGaPmYpzo175.png

4.目录结构

Makefile: 编译脚本

application: 业务层

module: 功能模块层

driver: 硬件驱动层

5. 执行序列演示

图中橙色的箭头,表示从云端发来一个控制指令。

业务层接收到指令后,解析指令,发送给 Control 模块。

Control 模块再次解析具体的指令,发送给 ZigBee 设备,同时记录到日志中。

pIYBAGBihSmAekqcAArNNczJ25Q828.png

编辑:jq

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

    关注

    5186

    文章

    20165

    浏览量

    329065
  • 驱动
    +关注

    关注

    12

    文章

    1928

    浏览量

    88216
  • API
    API
    +关注

    关注

    2

    文章

    2173

    浏览量

    66261

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

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    分享一个嵌入式开发学习路线

    拓展期(3-4个月) 学习嵌入式操作系统(RTOS)和物联网通信技术,能开发“多任务、联网”的复杂项目,理解企业级嵌入式开发的“架构思维”。这一阶段的学习
    发表于 12-04 11:01

    嵌入式软件分层架构设计原则

    嵌入式软件分层架构的设计原则如下: 模块化和可扩展性:每一层应当保持松耦合,这样当硬件变化或某些功能扩展时,只需要修改对应的层次,而不影响整体架构。 硬件无关性:上层代码应当尽量避免直
    发表于 11-28 07:05

    嵌入式开发的关键点介绍

    嵌入式开发在现代科技中扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要开发人员具备深入的硬件知识和编程
    发表于 11-13 08:12

    恩智浦如何攻克两大嵌入式开发难题

    在我们的身边,嵌入式系统无处不在。而随着技术的进步和应用的拓展,今天的嵌入式开发也面临着诸多新课题、新挑战。
    的头像 发表于 10-27 09:28 1231次阅读

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作、内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代码、中断处理
    发表于 10-21 16:25

    新一代嵌入式开发平台 AMD嵌入式软件和工具2025.1版现已推出

    AMD 2025.1 版嵌入式软件和工具是面向新一代嵌入式系统开发而打造的综合平台,全面加速概念构想到部署落地。 2025.1 版嵌入式软件和工具的新 增功能 AMD
    的头像 发表于 08-20 09:15 3645次阅读

    嵌入式开发就业还有前景吗?

    。在智能家居领域,嵌入式开发的主要工作是开发各种智能化设备和系统,如智能照明、智能安防、智能家电等。嵌入式开发人员需要掌握相关的硬件和软件技术,如处理器、传感器、通信技术、操作系统等,
    发表于 07-16 10:47

    嵌入式开发入门指南:从零开始学习嵌入式

    随着物联网、智能硬件的发展,嵌入式开发成为热门技能之一。以下将为初学者提供一份详细的嵌入式开发入门指南,涵盖学习路径、必备工具、推荐资源等内容。 1. 嵌入式系统的定义与应用嵌入式系统
    发表于 05-15 09:29

    嵌入式开发:高门槛的系统性工程与 996 的行业困局

    嵌入式开发的门槛,往往被培训机构和表象所掩盖。许多人误以为 “用 C 语言写个跑在 ARM 上的程序” 就是嵌入式,实则连皮毛都未触及。真正的嵌入式开发是硬件与软件深度融合的系统性工程,需跨越三重壁垒
    的头像 发表于 04-09 11:06 687次阅读
    <b class='flag-5'>嵌入式开发</b>:高门槛的系统性工程与 996 的行业困局

    2025年嵌入式开发趋势:新技术如何影响你的工作?

    嵌入式开发的世界正在快速变化,新技术的崛起正悄然改变硬件设计、软件架构以及开发方式。无论你是刚入门的新手,还是经验丰富的工程师,理解这些趋势不仅能帮助你应对技术变革,还能在职业发展中占据主动
    的头像 发表于 03-14 17:36 2846次阅读
    2025年<b class='flag-5'>嵌入式开发</b>趋势:新技术如何影响你的工作?

    BlackBerry QNX推出通用嵌入式开发平台

    BlackBerry有限公司(纽交所代码:BB;多伦多证券交易所代码:BB)旗下部门QNX今日宣布推出QNX 通用嵌入式开发平台(General Embedded Development
    的头像 发表于 03-11 16:04 954次阅读

    代码+案例+生态:武汉芯源半导体CW32嵌入式开发实战正式出版

    尊敬的各位电子工程师、嵌入式开发爱好者们:大家好!今天,我们怀着无比激动与自豪的心情,向大家宣布一个重大喜讯——武汉芯源半导体的单片机CW32正式出书啦!《基于ARMCortex-M0+的CW32
    的头像 发表于 03-03 15:15 1025次阅读
    代码+案例+生态:武汉芯源半导体CW32<b class='flag-5'>嵌入式开发</b>实战正式出版

    盘点工程师常用的嵌入式开发工具

    嵌入式开发涉及硬件与软件的紧密结合,开发工具的选择对效率和质量至关重要。以下是嵌入式开发中常用的工具分类及代表性工具,涵盖开发全流程: 1. 集成
    的头像 发表于 02-07 10:06 3787次阅读

    嵌入式开发必备-RK3562演示Linux常用系统查询命令(上)触觉智能出品

    实用干货!嵌入式开发学习必备-RK3562演示Linux常用系统查询命令(上)关注触觉智能持续为大家带来更多嵌入式开发内容
    的头像 发表于 12-31 10:51 117次阅读
    <b class='flag-5'>嵌入式开发</b>必备-RK3562演示Linux常用系统查询命令(上)触觉智能出品

    如何使用 RISC-V 进行嵌入式开发

    、准备开发环境 选择开发板 :RISC-V架构嵌入式开发板有多种选择,如GD32VF103R-START、飞凌嵌入式OK113i-S等。选
    的头像 发表于 12-11 17:32 2763次阅读