class="markdown_views prism-atom-one-light">
不抛弃、不放弃 - 士兵突击
从今天开始我们来扯一扯嵌入式Linux系统优化的那些事儿。。
嵌入式系统(Embedded System),是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。[1][2]嵌入式系统常被用于高效控制许多常见设备,被嵌入的系统通常是包含数字硬件和机械部件的完整设备,例如汽车的防锁死刹车系统。相反,通用计算机如个人电脑则设计灵活,可以智能处理各式各样的运算情况,以满足广大终端用户不同的需要。
现代嵌入式系统通常是基于微控制器(如含集成内存和/或外设接口的中央处理单元)的,但在较复杂的系统中普通微处理器(使用外部存储芯片和外设接口电路)也很常见。通用型处理器、专门进行某类计算的处理器、为手持应用订制设计的处理器等,都可能应用到嵌入式系统。常见的专用处理器有数字信号处理器。
嵌入式系统的关键特性是处理特定的任务,因此工程师能对其进行优化,以降低产品的体积和成本,提升可靠性和性能。
嵌入式系统的物理形态包括便携设备如计步器、电子手表和MP3播放器,大型固定装置如交通灯、工厂控制器,大型复杂系统如混合动力汽车、磁共振成像设备、航空电子设备等。它们的复杂度低至单片机,高至大型底盘或外壳内安装有多个部件、外设和网络。
嵌入式Linux 是嵌入式系统中比较主流的一种,其以Linux 为嵌入式设备的操作系统,并广泛用于消费电子,移动电话,航天航空电子中。其Wiki上如是描述:
嵌入式Linux(英语:Embedded Linux)是一类嵌入式操作系统的概称,这类型的操作系统皆以Linux内核为基础,被设计来使用于嵌入式设备。这类操作系统被广泛地使用在移动电话、个人数码助理(PDA)、媒体播放器以及众多消费性电子设备中。
比起发行版的Linux 系统,嵌入式Linux 以Linux 为蓝本,进行了大规模的裁剪,只保留目标平台需要用到的东西。其保留了Linux 的开放性,并且也具体嵌入式设备的需求。
但是由于Linux 的庞大以及其为桌面服务器系统的本质,所以在一些性能方面确实是无法达到预期目标,为此还有专门的社区分支基于Linux 开发了支持硬实时的RT分支版本。由于Linux 的兼容性非常的好,所以嵌入式Linux的贱人显然也是完美的。嵌入式设备提供商可以按照自己的需求随意裁剪Linux 源码,并添加自己的功能。
不管要做出什么样形态的产品,用户体验总是会被大家推崇到首位,你系统做的在牛逼,架构选的多么的新颖,算法多么的前无古人。假如你的产品用起来体验很烂,照样没有客户埋单。
用户体验又分为了好多类型,比如外观、材质、手感这属于外部的一个感官。俗称颜值。比如玩王者农药是否卡?费电吗?防水吗?能看VR吗?美颜效果如何?这一类体验属于交互体验。交互体验是内在。再比如还有一类人比较关心的就是是否有一些特 {MOD}功能,比如红外、虹膜、指纹。 这些功能其实对于大多数的消费者而言都是锦上添花。但是对于一些极客而言,确实实打实的可用功能。归到最后其实就是,始于颜值,陷于才华,忠于人品。
那么你如果满足了上述的要求,作为消费产品,又会回归一个比较俗的话题,那就是价格。 恩恩,扯远了。
交互体验的最终目的就是迅速,人机交互的响应很迅速。不过我任务对于大多数泛嵌入式终端产品来讲,大多其实是无人值守的交互状态。所谓无人值守,即是设置好了预期指令,可以在不需要人为交互的情况下,做出响应。比如交换机,路由器,中控器等。这些设备大多是提供协作功能,其本身不需要太多的人机交互,更多的是用来做人机->机或者机->人机 交互的通路。
这些设备的要求,要比单纯的人机交互设备的响应要求更高。 大家可以接受电脑或者手机重启一次,或者死机一次。 但是无法忍受断电,断网。
嵌入式系统设备的优化目的大抵可以从下面几个点去概括
- 增强系统的稳定性
- 加速系统和程序
- 减小系统和程序的体积(裁剪)
- 降低系统的功耗
- 提供系统的响应能力
- 成本和组合的优化效果
- 终极优化的策略
上述总结出自魅族的内核团队大神吴老师总结的,我觉得概括的很全面,也很到位。
随着业务的增量变化,没有百分之一百的稳定性,只有百分之99.9的稳定性,我们的目标其实也就是百分之99.9的稳定性,这样的系统才是最健壮的。
根据吴老师的描述,可以通过以下手段来进行稳定性的测试取样,然后做评比。
- 尽量模拟各种潜在的应用场景,需要构造应用场景测试例。
- 使用各种压力测试环境将系统上资源利用到极致,采用Linux 现有的测试工具,可做成一套完整的测试流程。
- 采用标准的测试套件将整个系统的兼容性(是否符合标准)、完整性(功能是否完善)、健壮性(是否容易Crash)。
- 处理器:cpuburn(FPU) + gkrellm + lm_sensor 压力测试
- 图形处理器:Neocore (3D), NenaMark(OpenGPL ES 2.0)
- 内存:memtest86+, memtester,CPU厂商自带的bootloaderi/xloader
- 串口:minicom, cat /dev/ttyS0, cat /dev/ttyUSB0
- 闪存(NOR/NAND):mtd-utils, flash_eraseall, flashcp
- 声卡:alsa-utils, amixer, alsamixer, aplay /dev/urandom;mplayer -ao alsa|oss
- 摄像头:v4l2, mplayer tv://dev/video0
- USB:usbutils, lsusb; usbstress,可挂载存储设备测试
- 显卡/LCD: mplayer, directfb, directfb-examples
- I2C: i2c-tools, i2cdetect -l, i2cget, i2cset, i2cdump
- RTC:util-linux, date + hwclock -r/-w
- 传感器:lm-sensors, sensors, gkrellm
- 键盘/鼠标:showkey; xdotool(simulate)
- 功能键:/sys/class/input/; HAL+Dbus, hotkey.py
- 触摸屏:Tslib
- 触摸板:gpointing-device-settings, tpconfig
- 磁盘:hdparm; hddtemp; badblocks -s -v /dev/sda1;smartctl -a /dev/ad0,blkid,sg-utils
- 以太网、无线、蓝牙:/sys/net/, ethtool, dhclient, ifconfig, ping -IethX -s psize -f, netperf -A -l, network-manager, wireshark,netsniff-ng
- FC,ISCSI: targetcli,lio,iscsitarget
那么在嵌入式系统中,为了提高设备的响应速度以及稳定性我们应该要优化什么?我觉得可以从下面几个方向入手。
上述优化前提是你自己的程序已经在一个比较良好的算法或者调度下已经无法迈出往前一步了,当然我这儿只是类比。具体还要根据生产环境来决定。因为很多人根据无需去优化这些,把自己写的业务代码优化好才是王道。
- 设计 – 遵循标准开发规范,参考POSIX,LSB等统一标准。
- 流程 – 遵循标准开发流程。
- 编码 – 编码风格参考内核代码风格,风格一致性检查。 scripts/checkpatch.pl。
- 静态检查 – Sparse,coccinelle,smatch。
- 编译时检查 – -Wall -Werror -std=c89-pedantic-errors。
- 运行时诊断和调试 – Debugging/Tracing API
参考资料: