嵌入式系统调优与应用部署全解析
系统调优策略
在系统调优方面,我们可以采取多种策略来提升系统性能和减少启动时间。
精简初始化脚本以减少代码量和启动时间
在构建放置于设备上的根文件系统过程中,可执行步骤 1 和 2。由于这些文件已存在,代码无需再进行检查。对于无控制台的嵌入式设备,可省略步骤 3,因为用户不会看到设备启动过程。最终脚本仅保留步骤 4,且只有一行代码,代码量可实现 56 比 1 的缩减。持续对所有用户初始化脚本执行此操作,可将启动时间减少一到两秒。
利用 inittab 文件启动系统
许多系统依赖 SysV init(或其 BusyBox 变体)来启动。init 程序会读取
/etc/inittab
文件来确定何时运行哪些程序。我们可指定在系统启动时执行一次的命令,且命令数量无限制,按出现顺序执行,类似脚本。以下是使用
/etc/inittab
和
/etc/init.d/rc
文件的示例:
/etc/inittab
::sysinit:/etc/init.d/rc
::respawn:/usr/bin/the-app
/etc/init.d/rc
#!/bin/sh
/bin/mount -t proc none /proc
/bin/mount -t tmpfs -o \
size=128k,mode=0755 none /dev
/bin/mount -o remount,rw /
/sbin/ifconfig lo 127.0.0.1 up
/sbin/route add -net 127.0.0.0 \
netmask 255.0.0.0 lo
在上述示例中,init 进程启动
/etc/init.d/rc
文件执行必要的启动配置工作。若将
/etc/init.d/rc
文件中的所有命令移至
/etc/inittab
脚本,虽仅能节省十几毫秒,但积少成多:
/etc/inittab
::sysinit:/bin/mount -t proc none /proc
::sysinit:/bin/mount -t tmpfs -o \
size=128k,mode=0755 none /dev
::sysinit:/bin/mount -o remount,rw /
::sysinit:/sbin/ifconfig lo 127.0.0.1 up
::sysinit:/sbin/route add -net 127.0.0.0 \
netmask 255.0.0.0 lo
::respawn:/usr/bin/the-app
/etc/init.d/rc
Empty!
两种方式完成的工作量相同,但从 inittab 运行命令的开销更小,还能使根文件系统稍小,不过这并非主要目的。
使用 GNU 哈希风格链接
编译共享库时,有一个包含符号哈希值的部分,动态链接器需解析这些符号。为创建查找信息,用哈希码标识系统。若多个符号产生相同哈希码,链接器会顺序搜索相同哈希码的符号直至找到匹配项。使用如 GNU 哈希风格这种产生唯一哈希码可能性高的哈希系统,可减少或避免链接器的顺序搜索,加快链接速度。部分编译器默认开启此功能。使用 GCC 的
-###
选项可查看 GCC 构建可执行文件的具体步骤。添加
-Wl,--hash-style=gnu
参数到编译或链接步骤即可使用该功能:
$ arm-linux-gcc -Wl,--hash-style=gnu app.c -o app
使用以下命令查看文件的动态部分,可验证程序是否使用 GNU 哈希:
$ arm-linux-readelf -d app
Dynamic section at offset 0xf18 contains 24 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
0x0000000c (INIT) 0x8350
0x0000000d (FINI) 0x85c0
0x00000019 (INIT_ARRAY) 0x10f0c
0x0000001b (INIT_ARRAYSZ) 4 (bytes)
0x0000001a (FINI_ARRAY) 0x10f10
0x0000001c (FINI_ARRAYSZ) 4 (bytes)
0x6ffffef5 (GNU_HASH) 0x81a8
0x00000005 (STRTAB) 0x8278
0x00000006 (SYMTAB) 0x81e8
0x0000000a (STRSZ) 92 (bytes)
此更改仅影响正在编译的程序,无需重新编译系统中的库或其他程序。速度提升与程序使用的符号数量成正比。若程序仅使用共享库的少量函数,静态链接可进一步减少加载时间。需注意,并非所有目标板都支持 GNU 哈希,如 MIPS 就不支持,编译应用程序后需在目标板上运行以确保动态链接器正常工作。
嵌入式设备开发与部署全流程
嵌入式应用的部署与传统应用不同,需在设计阶段就考虑如何将应用部署到目标设备上。以下是嵌入式设备从需求分析到部署的全流程。
需求分析
嵌入式设备有明确目的,需求规定了设备的功能、成本、外观和包装等。起草需求时要考虑购买者和使用者以及使用方式。设备需求决定后续步骤,如低成本设备不会用铝制外壳,面向 IT 部门的设备需适配 19 英寸电信机架,音乐播放器需长续航和大容量内存。设计过程中测试会影响需求,如音乐播放器用户运动时使用,可能需增加心率监测、卡路里计数或秒表功能。工程师需理解需求并转化为软硬件设计,记录因工程限制导致的需求偏差及原因。
工业设计
此阶段创建设备的外观和手感,不仅包括软件 UI,还涉及外壳材料、重量和形状。营销部门了解目标用户、市场及产品差异化特征。通常此阶段较少关注技术部分,除非有营销需求,如规定设备尺寸或重量。输出为高分辨率渲染图或手工模型。工业设计师主导此过程,了解用户与物体的交互方式及适用材料。消费设备和医疗设备此阶段耗时较长,前者外观影响销售,后者需确保操作安全和输出清晰。此阶段主要确保设备有部署软件所需的输入输出端口,若有特殊需求,如超薄设备需 10 - Base - T 以太网端口,需及时提出。
机械设计
机械/电气工程师在此阶段将技术部件融入工业设计的设备外壳。若设备有 LCD,需考虑适配的组件。最终输出是显示电子元件、电池、连接器、外部端口开口、扬声器和麦克风位置的高层图纸。此阶段确定处理器、RAM 和存储内存的选择,考虑使用现成的适配板,确定处理器与外设的通信方式。需指定设备上用于编程和测试的端口,如诊断串口和 JTAG 引线。同时要梳理板上所有设备,明确使其运行所需的驱动和程序,如音频软件栈、支持 Linux 的 Wi - Fi 芯片组等,记录并处理编解码器许可问题。此阶段软硬件设计相互影响,工业设计和机械设计可能存在冲突,需进行调整。
电气工程
此阶段将电气部件安装到电路板并进行布线,使不同电压和信号要求的组件协同工作。电气工程师验证机械设计能否容纳技术部件及是否适配工业设计外壳,常发现需修改机械或电气设计的问题,输出用于制造设备的原理图。此时可获得测试夹具,用于测试部署是否正常。可使用板上设施复制引导加载程序和操作系统到板上并验证其工作情况。根据前一步所选组件,可能需焊接诊断和编程电缆的引线或制作自定义电缆。此阶段会引入诊断功能,电气工程师需确保电路板正常工作并测试电气设计,软件组需提供测试和验证代码。若设备订单量大,闪存存储组件制造商可在生产过程中预装引导加载程序和操作系统,制造商需提供文件格式并提供少量测试芯片。
下面用 mermaid 流程图展示嵌入式设备开发流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A([需求分析]):::startend --> B(工业设计):::process
B --> C(机械设计):::process
C --> D(电气工程):::process
D --> E(制造与部署):::process
E --> F([完成]):::startend
以上就是嵌入式系统调优和设备开发部署的相关内容,通过合理运用这些方法和流程,可有效提升嵌入式系统的性能和开发效率。
嵌入式系统调优与应用部署全解析
嵌入式设备部署的特点与挑战
嵌入式设备的应用部署与传统桌面系统有很大不同。传统桌面系统部署应用时,该应用只是设备上运行的多个应用之一,且可能不清楚目标机器上还运行着其他什么程序。而嵌入式系统的部署是一个累加的过程,系统已经在运行,部署的任务是将应用放置到合适的位置并更新相关配置文件。在制造阶段,需要创建执行应用所需的一切,并准备好在设备制造时烧录到设备上。
作为嵌入式工程师,对设备上出现的应用及其初始配置有很大的控制权,这减轻了一些传统项目工程师需要解决的问题,但也带来了一些新的挑战。例如,设备出厂后用户可能会添加任意应用,像手机应用市场或网络交换机的路由数据应用等。因此,初始的引导加载程序、内核和应用程序集必须放置在设备上,确保消费者开机后设备即可使用。如果设备设计为可定制,初始软件加载中就需要包含下载和安装新应用的代码。
部署过程中的关键要点
在嵌入式设备的部署过程中,有几个关键要点需要特别注意:
1.
早期规划
:在设计过程的早期就要考虑应用如何部署到目标设备上。设备的设计和制造方式会极大地影响应用的部署,因此部署必须在产品开发的最早阶段就融入产品设计中,从工业设计阶段就开始考虑。
2.
硬件与软件的协同
:在整个开发过程中,硬件和软件的设计相互影响。例如,在机械设计阶段,选择的处理器、内存等硬件组件会影响软件的运行;而软件的功能需求也会对硬件的选型和设计提出要求。在电气工程阶段,要确保硬件能够支持软件的部署和运行,同时软件也要能够充分利用硬件的性能。
3.
测试与验证
:在每个阶段都需要进行充分的测试和验证。在机械设计阶段,要测试硬件组件的兼容性和性能;在电气工程阶段,要使用测试夹具验证部署的可行性和设备的功能;在软件设计阶段,要对应用程序进行功能测试、性能测试等。只有通过充分的测试和验证,才能确保设备在部署后能够正常运行。
部署方式的选择
根据不同的需求和场景,可以选择不同的部署方式:
| 部署方式 | 特点 | 适用场景 |
| — | — | — |
| 静态链接 | 程序在编译时将所有依赖的库文件都包含在可执行文件中,运行时无需再加载外部库。 | 程序使用共享库的函数较少,对加载时间要求较高的场景。 |
| 动态链接 | 程序在运行时动态加载所需的共享库文件。 | 程序使用大量共享库,且多个程序可以共享同一库文件,节省内存空间的场景。 |
| 远程部署 | 通过网络将应用程序和配置文件传输到目标设备上进行部署。 | 设备具备网络连接功能,且需要远程更新和管理应用的场景。 |
| 本地部署 | 将应用程序和配置文件直接复制到目标设备的存储介质上进行部署。 | 设备没有网络连接,或者对安全性要求较高,不适合通过网络传输数据的场景。 |
部署后的维护与更新
设备部署到现场后,还需要进行维护和更新。随着技术的发展和用户需求的变化,可能需要对设备上的内核和程序进行更新。在更新过程中,需要注意以下几点:
1.
兼容性
:确保更新后的内核和程序与设备的硬件和其他软件组件兼容,避免出现不兼容导致设备无法正常运行的问题。
2.
安全性
:在更新过程中,要确保数据的安全性,防止数据泄露和恶意攻击。可以采用加密传输、数字签名等技术来保障更新的安全性。
3.
备份与恢复
:在更新之前,对设备上的重要数据和配置文件进行备份,以防更新过程中出现问题导致数据丢失。同时,要具备恢复功能,能够在更新失败时将设备恢复到更新前的状态。
下面用 mermaid 流程图展示嵌入式设备部署后的维护与更新流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A([设备部署]):::startend --> B(运行监测):::process
B --> C{是否需要更新?}:::process
C -- 是 --> D(备份数据):::process
D --> E(下载更新文件):::process
E --> F(更新内核和程序):::process
F --> G(测试验证):::process
G --> H{更新是否成功?}:::process
H -- 是 --> I(更新完成):::process
H -- 否 --> J(恢复到更新前状态):::process
J --> B
C -- 否 --> B
I --> B
综上所述,嵌入式系统的调优和应用部署是一个复杂的过程,需要从系统调优策略、设备开发全流程、部署特点与挑战、部署方式选择以及部署后的维护与更新等多个方面进行综合考虑。只有合理运用各种方法和技术,才能确保嵌入式设备的性能和稳定性,满足用户的需求。
超级会员免费看
2283

被折叠的 条评论
为什么被折叠?



