46、嵌入式应用程序部署全解析

嵌入式应用程序部署全解析

1. 前期服务与工程环节

1.1 编程带和卷盘服务

对于大批量订单,批发硬件经销商会为闪存部件提供编程服务。你只需提供要写入设备的镜像,经销商就会将其烧录到芯片上。之后,编程好的芯片会被放置在聚酯薄膜带上,并缠绕到卷轴上,供制造机器人用于构建电路板。

1.2 制造工程

制造工程师要确定组装设备所需的步骤。他们依据机械设计,制作用于塑造设备塑料部件的模具等工具,确保部件符合规格。这包括编写合同制造商可遵循的组装手册,以及确保电气工程师指定的所有部件都可用且规格明确。制造工程通常在设计过程早期介入,协助工业和机械工程师设计更易于制造的产品,但大部分工作在流程后期完成。

制造工程师会检查组装设备所需的所有部件,并手工制作前几个样品,生成首件报告,本质上就是部件的问题清单。如果有用于对电路板进行编程和测试的夹具,制造和测试工程师也会对其进行测试,确保软件加载和测试程序按预期运行。

制造工程师主要关注尽可能精确地实现设计。重点在于创建其他团队可遵循的说明,并确保这些说明能按要求执行。测试程序对他们至关重要,目标是尽快将代码加载到目标设备上,并迅速确认设备正常工作。设备的初始软件加载包含一些测试代码,以便从更高层面验证设备是否正常工作。这意味着测试程序必须是初始软件加载时放置在设备上的根文件系统的一部分。如果设备资源不足以同时运行测试程序和应用程序,则必须创建特殊的根文件系统和/或内核来包含测试代码。设备通过测试后,此软件将被最终面向消费者的软件所取代。

1.3 软件开发各环节

1.3.1 软件设计

大约在进行工业设计的同时,软件团队开始设计设备上运行的内容。这对工业和机械设计有直接影响,例如设备是否配备触摸屏、键盘或两者皆有?输出是LED显示屏上的几行内容吗?满足需求需要哪些外设,驱动这些外设需要哪些软件?此时需要决定使用Linux还是其他操作系统。

软件设计需要考虑设备上存储的内容、设备运行的应用程序数量和类型。例如,设备是否需要在制造时将所有应用程序都安装在根文件系统上,还是用户可以自定义在板上运行的应用程序集?新程序如何加载到板上?这个系统能否用于安装软件的初始部分?

如果软件在制造后安装到设备上,设备需要额外的服务来支持软件安装。例如,网络设备有多个以太网端口,可用于安装软件;消费电子设备有USB端口,可作为数据传输机制,但这意味着设备必须具备必要的驱动程序和工具才能利用这些硬件。

1.3.2 软件工程

此阶段进行设计阶段指定的软件开发工作。你可能熟悉这个阶段和软件设计步骤,此过程的输出是在制造过程中放置在设备上的二进制代码。

此阶段的部署工作主要包括确保设计按要求实现并进行适当测试。随着工业设计的推进,可以在更完整的单元上进行测试,最终在制造样品(有时称为首件)上进行测试。此步骤的目标是确保将软件加载到板上的过程完全可重复,并且可以通过板上的外设和连接器完成。软件工程阶段有时会暴露出需要通过更改机械或电气工程来解决的问题,因此尽早考虑最终软件(以及后续更新)如何加载到板上是很有必要的。

制造工程师还会帮助理解制造团队对用于在设备上写入数据的文件格式的要求。如果通过串口上的引导加载程序对板进行编程,则必须创建与引导加载程序交互以复制数据的脚本。使用引导加载程序正变得越来越普遍,因为NAND内存可能有相当数量的坏块,写入数据的软件必须妥善处理这些问题。如果板上有NOR闪存,则坏块是例外情况,因此可以在假设NOR介质无错误的情况下对内存进行编程。

部署工作的最后一部分是创建确保设备正常工作的软件。此文件包含在根文件系统中,制造商在部分设备样本上运行该文件,以确保设备按规格运行。由于此诊断代码存在于所有设备上,可通过按下正确的按键序列或将格式正确的数据包发送到设备来激活该代码(恭喜,你创建了一个复活节彩蛋!)。

需要注意的是,对于非常大的生产批次,会创建测试夹具,它应该取代在电气层面执行测试的测试软件。可能需要一些额外的测试软件,但测试夹具会完成大部分测试工作。然而,对于较小的生产批次,创建单独测试夹具的成本无法在生产批次中分摊,除非为每个设备增加大量成本。因此,小批量、对成本敏感的设备更倾向于软件级测试而非硬件级测试。

1.4 生产规模的影响

虽然嵌入式设备的开发过程可能相同,但生产的设备数量最终决定了管理部署所需的时间。生产50台设备的批次可能不需要高度自动化的安装和测试过程,因为人工执行任务更经济;但生产50,000台设备的批次则需要完全自动化的部署,以实现盈利生产。

但这并不意味着小批量生产就一定意味着低自动化。对于部署必须谨慎进行的小批量生产设备(例如,如果配置不当可能会对人员造成伤害的工业控制设备),会采用高度自动化的程序来减少部署步骤中的人为错误。

1.5 制造环节

制造过程通常与其他开发步骤分离,不同组件的组装工作通常在合同制造商处进行,可能位于另一个国家。如果设备在内部组装,同样需要详细的步骤,但由于距离和语言障碍的减少,过程可以容忍一些模糊性。

执行制造步骤的公司知道如何操作注塑机和组装部件,但对所组装的设备的专业知识了解甚少,今天组装机器人玩具,明天可能组装你的设备。因此,部署软件的步骤应尽可能机械化。人员和/或机器人会尽力组装设备,但他们无法做出技术决策。

此过程的输出是成品设备。设备将以散装包装形式交付到你的场地,或者如果产量足够高,将装入盒子并直接发送到供应链,最终销售给最终用户。

1.6 各开发阶段的部署考量

开发阶段 部署考量
工业设计 目标:确保设计适应部署。
- 用户如何了解设备上运行的软件?
- 用户是否会在设备上运行任意软件?
- 用户是否可以访问技术元素?用户是否对技术元素感兴趣?
机械设计 目标:确保设备具备将软件加载到板上的适当部件和硬件接口,并拥有足够的资源来运行应用程序。
- 设备将有哪些物理访问端口?USB、网络、Wi-Fi?
- 这些端口将如何配置?设备将使用标准还是非标准连接器?
- 设备需要多快的启动速度?
- 有多少内存和内存扩展空间可用?
- 可以使用什么处理器?电池续航时间是多少?
- 用户如何与设备上的外设进行通信?
电气工程 目标:确保设备具有正确的连接器,如果开发需要定制电缆,则获取引脚输出。添加必要的诊断测试点或LED。
- 电路板是否具备开发所需的所有部件?
- 如果需要特定芯片功能,引脚是否已正确布线以便访问?
- 是否可以在设计中放置串口和JTAG连接器?
- 可以在板上放置哪些诊断指示器?
制造工程 目标:验证机械和电气工程阶段开发的内容能否按预期的生产批量完成。制定计划,以便第三方可以轻松测试和验证设备。
- 软件如何烧录到闪存中?
- 可以在板上放置哪些测试软件,以便制造人员能够轻松、明确地查看电气组件是否正常工作?
软件设计 目标:根据生产数量,在设备上安装必要的软件,使部署尽可能机械化。确定最终用户需要向设备提供哪些无法在工厂完成的数据,并确保有方法收集这些信息。
- 用户首次启动设备时,从软件角度需要发生什么?
- 可以向用户提供哪些诊断功能?
- 在设备正常运行之前,必须收集哪些用户特定信息?在收到这些信息之前,设备如何运行?
- 必须执行哪些校准步骤?校准信息存储在哪里?
- 用户如何更新设备上的软件?提供哪些连接用于通信?
软件工程 目标:使部署过程尽可能易于执行,明确指出问题和缺陷,确保在软件和硬件正常工作之前,设备不会出厂。
- 电路板是否有足够的资源来存储用户特定信息?
- 电路板是否会运行正确的部署服务?
- 如果软件在交付制造阶段时尚未准备好,电路板组装后能否更新文件系统和内核?
制造 目标:使安装和测试过程易于执行。如果设备将进行大批量生产,测试和验证程序。确保易于识别部署问题。
- 制造商如何快速评估一个单元是否可以发货?
- 如何使制造步骤尽可能无错误?
- 制造公司如何判断在部署软件或制造设备时是否发生了错误?
- 可以采取哪些补救措施来修复有问题的设备?

1.7 部署策略和战术

1.7.1 常见用例
  • 单用途、资源受限设备 :这是简单的“运行一个应用程序”的设备,仅拥有足够的内存和存储来运行设计的应用程序。这些设备曾经使用微控制器创建,但由于额外的要求,如工作的Wi-Fi栈和更复杂的显示屏,导致选择Linux作为操作系统。
  • 多用途、资源限制较少的设备 :这是如手机、数码相框、IP电话、测试和测量夹具或其他消费电子设备。这些设备没有硬盘(与下一类设备不同),但有几兆字节的存储空间。这类设备的一个关键区别是制造商可能不知道最终在目标设备上运行的程序。为了降低物料清单(BOM)成本并延长电池供电设备的电池寿命,这些设备的资源受到限制。
  • 多用途、资源丰富的设备 :这些是信息亭或网络管理设备,没有消费电子设备那样对成本的严格限制。基本上,存储和处理能力没有上限,这意味着可以不必像其他类型设备那样过于关注资源的最小化使用。该设备包括多种与外界通信的方式,例如多个网络端口、USB连接器和一两个串口。

如果您正在进行嵌入式项目,请考虑项目在这些用例中的位置以及将进行何种类型的制造。对于大规模生产(每年数千台)的设备,应尽量减少人工干预进行编程:即使投入一个月的开发工作,如果能为每个设备节省5分钟的人工操作,且使最终软件部署更简单、更不易出错,那么这种投入也是值得的。

1.8 引导加载程序

1.8.1 引导加载程序概述

引导加载程序是系统上运行的第一段代码,其任务是加载操作系统,最终使设备上的应用程序运行起来。如今,引导加载程序功能更强大,可成为部署过程的一部分。这部分内容涵盖将引导加载程序安装到板上、为启动进行配置,以及使用它来安装初始内核和根文件系统。

根据硬件设计,板上可能预装了引导加载程序,硬件供应商可能会根据您的订单数量为您进行编程。然而,您可能需要负责将引导加载程序编程到目标板上,这是您需要纳入开发计划的内容。无论引导加载程序如何安装到板上,都必须对其进行配置,使其能够启动您的应用程序。

1.8.2 引导加载程序的一般特性

现在的引导加载程序更加复杂,不仅可以用于启动板,还可以作为工具发挥更多作用。一些引导加载程序,如UBOOT和GRUB,具有可与早期通用操作系统相媲美的功能集。在部署软件时,可以充分利用这些功能。

还需要对引导加载程序进行一些与部署相关的配置更改,以确保设备启动时能正常工作。例如,在开发过程中,引导加载程序可能配置为在重启过程中暂停,以便可以中断并进入命令提示符,在生产版本的引导加载程序中通常会移除这个功能(除非您希望用户能够使用该功能)。同样,配置参数控制着引导加载程序的初始命令集,在开发时,这些参数可能是在引导加载程序的命令行中输入并保存到闪存中的,这些参数也应内置到引导加载程序中。

1.8.3 常见用例及示例

以下是使用引导加载程序时可能遇到的常见用例,以UBOOT为例说明如何解决这些问题:
- 配置引导加载程序以运行内核 :引导加载程序启动时,需要知道如何运行内核。在像GRUB这样的引导加载程序中,此信息来自配置文件。一些引导加载程序允许将此信息作为可执行文件的一部分。此示例展示了如何修改源代码以指定启动时运行的命令。
- 将初始引导加载程序安装到板上并进行初始配置 :需要将引导加载程序复制到板上。除了物理方面的问题,如板上是否有支持串口、网络或JTAG连接的触点,可能还需要创建代码来自动化此过程,或者与制造商合作提供正确的二进制文件,以便生产系统能够完成这项工作。
- 使用引导加载程序为板编程根文件系统 :对于小批量生产,您可能需要负责软件的部署。引导加载程序在这项任务中非常有用,因为它可以与底层硬件协作,并且可以进行脚本编程。示例中展示了使用expect进行脚本编程,但您也可以使用几乎任何串口脚本工具。

1.8.4 UBOOT初始参数配置

部署到板上的引导加载程序必须进行配置,以使其尽可能准备好启动。为了使过程尽可能无错误,引导加载程序应默认预编译包含板的设置。例如,假设在文本夹具上使用以下命令通过UBOOT启动内核:

UBOOT # load kernel ; bootm

此命令应设置为UBOOT的默认启动命令,并且启动延迟时间应设置为0,以便板尽快开始启动过程。当为板配置UBOOT时,它包含一组预定义的板环境变量,需要更改这些变量,使放置在板上的引导加载程序默认具有正确的设置。为此,将板的 CONFIG_BOOTARGS CONFIG_BOOTCMD 设置为适当的值。对于UBOOT,这些设置位于 include/configs/<板名称>.h 文件中。例如:

#define CONFIG_BOOTARGS  \
               "mem=56M console=ttyS0,115200n8 root=/dev/hda1 rw noinitrd ip=dhcp"

#define CONFIG_BOOTCOMMAND  \
"nboot kernel ; bootm"
#define CONFIG_BOOTDELAY  0

当板启动时,它将具有从闪存加载内核并开始启动的正确命令集。使用像UBOOT这样的引导加载程序时,初始启动命令可能更复杂,因为需要执行几个步骤来初始化UBOOT。通常的命令序列(每个板不同,此示例仅用于说明概念)如下:
首先,必须设置闪存的动态区域,因为环境变量存储在此处。第一个 saveenv 命令将默认环境变量写入此位置。

以上就是嵌入式应用程序部署过程中前期服务、各工程环节、生产规模影响、部署策略以及引导加载程序等方面的详细内容。在后续部分,我们将继续深入探讨引导加载程序的更多操作细节以及整个部署流程中的一些关键要点。

2. 引导加载程序的操作细节与部署流程要点

2.1 引导加载程序的操作步骤

2.1.1 配置引导加载程序以运行内核
  • 确定信息来源 :不同的引导加载程序获取运行内核信息的方式不同。如GRUB通过配置文件获取,而有些引导加载程序可将此信息作为可执行文件的一部分。
  • 修改源代码 :以UBOOT为例,要修改源代码指定启动时运行的命令。在开发过程中,需根据实际需求调整相关代码。例如,若要将特定的内核加载命令设置为默认启动命令,就需要在相应的代码文件中进行修改。
2.1.2 安装初始引导加载程序到板上并进行初始配置
  • 物理连接检查 :确保板上有支持串口、网络或JTAG连接的触点,这是进行引导加载程序安装的基础物理条件。
  • 自动化代码创建 :可以编写代码来自动化引导加载程序的安装过程。例如,使用脚本语言编写脚本,实现与硬件的交互,将引导加载程序的二进制文件复制到板上。
  • 与制造商合作 :如果无法自行完成自动化安装,可与制造商合作,让他们提供正确的二进制文件,并确保生产系统能够完成安装工作。
2.1.3 使用引导加载程序为板编程根文件系统
  • 选择脚本工具 :对于小批量生产,可使用引导加载程序进行根文件系统的编程。可以选择如expect这样的串口脚本工具,也可以使用其他适合的工具。
  • 脚本编写 :根据引导加载程序的特性和硬件要求,编写脚本实现根文件系统的编程。例如,通过脚本与引导加载程序交互,将根文件系统的数据写入到板上的指定存储区域。

2.2 部署流程中的关键要点

2.2.1 不同生产规模的部署差异
生产规模 部署特点
小批量生产(如50台) - 可能不需要高度自动化的安装和测试过程,人工执行任务更经济。
- 对于部署要求严格的设备,如工业控制设备,会采用高度自动化程序减少人为错误。
- 倾向于软件级测试,因为创建单独测试夹具成本高,难以分摊到小批量生产中。
大批量生产(如50,000台) - 需要完全自动化的部署,以实现盈利生产。
- 可以投入一定的开发时间来优化部署流程,减少人工干预,提高效率和降低出错率。
- 对于非常大的生产批次,会创建测试夹具完成大部分测试工作。
2.2.2 各开发阶段的协同配合

在整个嵌入式应用程序部署过程中,各个开发阶段需要密切协同配合,形成一个有机的整体。以下是各阶段的协同要点:
- 工业设计与软件设计 :工业设计要考虑软件部署的需求,如设备的物理接口要满足软件安装和更新的要求。软件设计要根据工业设计的特点,合理规划软件的功能和布局。例如,如果工业设计确定设备采用触摸屏,软件设计就要开发相应的触摸交互功能。
- 机械设计、电气工程与软件工程 :机械设计要确保设备的物理结构能够容纳所需的硬件组件,为电气工程和软件工程提供基础。电气工程要提供正确的硬件连接和接口,保证软件能够正常与硬件进行通信。软件工程要根据硬件的特性,开发出高效、稳定的软件。例如,机械设计要为电路板预留合适的空间,电气工程要确保电路板上的引脚连接正确,软件工程要根据这些硬件条件开发驱动程序和应用程序。
- 制造工程与其他阶段 :制造工程要验证机械和电气工程的设计能否在预期的生产批量下完成,同时要根据软件设计的要求,制定合适的测试和验证计划。在制造过程中,要确保软件的部署步骤尽可能机械化,减少人为错误。例如,制造工程要确定软件如何烧录到闪存中,以及如何进行电气组件的测试。

2.3 部署流程的整体架构

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B(编程带和卷盘服务):::process
    B --> C(制造工程):::process
    C --> D(软件设计):::process
    D --> E(软件工程):::process
    E --> F{生产规模}:::decision
    F -->|小批量| G(小批量生产部署):::process
    F -->|大批量| H(大批量生产部署):::process
    G --> I(制造):::process
    H --> I
    I --> J([结束]):::startend

2.4 总结与建议

在嵌入式应用程序的部署过程中,要充分考虑各个环节的特点和要求,根据生产规模选择合适的部署策略。对于引导加载程序的配置和使用,要进行细致的规划和调试,确保设备能够顺利启动和运行。同时,各开发阶段的协同配合至关重要,只有各个环节紧密合作,才能提高部署效率,降低成本,保证产品的质量。

建议在实际项目中,提前制定详细的部署计划,明确各个阶段的任务和责任人。在开发过程中,及时进行测试和验证,发现问题及时解决。对于不同生产规模的项目,可以参考上述的部署特点和策略,进行合理的资源分配和流程优化。

通过对嵌入式应用程序部署的全面了解和合理规划,可以确保项目的顺利进行,为产品的成功推向市场奠定坚实的基础。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值