嵌入式Linux产品开发是一门综合型的技术;主要由编译平台构建、运行平台移植、驱动开发、系统环境支持以及应用开发等部分组成。从无到有的完整构建一个项目是十分复杂的过程,需要长期的经验积累。
本系列文章从实际项目出发,以上面的脉络流程为框架,讲解嵌入式Linux产品开发涉及的知识。
注意: 受个人水平限制,文章肯定有不足之处,如有发现,希望及时联系反馈(可联系微信:”sxc123456zc”)。
本节目录如下所示。
📑 嵌入式开发总结说明
📑 工程配套项目和说明
📑 嵌入式项目开发方法说明
📑 文档整理规划和开发板说明
嵌入式开发总体上包含应用开发、驱动开发和平台构建组成,具体说明如下。
📖 应用开发
嵌入式Linux应用开发是实现具体产品的技术;配合硬件平台,通过软件来实现满足具体功能需求的电子产品。除了交叉编译和增加对底层硬件的访问外,嵌入式Linux的应用开发和桌面端开发并无本质区别。
对于熟悉桌面应用开发的开发者,嵌入式Linux应用开发同样入门简单,也很容易做出可展示的应用。应用开发的例程和资源都很多,在目前的AI Agent时代也相对简单,如Web服务、Qt UI设计、MQTT、SNMP网络应用服务、图形检测等项目,理论上都有成熟的开源方案,只要在此基础上实现用户业务即可。
对于应用端根据平台的情况也支持多种开发语言的选择,常见的有C/C++/python/nodejs/java/go/rust等。相对其它部分来说,嵌入式Linux应用开发入门学习简单,曲线平坦,很适合用来体验嵌入式Linux开发的乐趣。
📖 驱动开发
嵌入式Linux驱动开发的方向则繁杂和困难,按照从底层到内核,包含如下知识点。
🔍 SOC的内部外设(GPIO、RTC、SPI、I2C、CAN、PCIE、USB等)
🔍 SOC的外部器件(Sensor、CMOS、DRAM、LCD、USB WIFI、SDCard等)
🔍 设备模型(总线、设备、驱动和类),设备树和设备树访问接口
🔍 U-Boot环境驱动开发支持,实现裸机驱动应用
🔍 Kernel环境驱动开发支持,实现系统模块化驱动应用
上述每一部分都不简单,即使掌握了这些技术,大部分情况下也只能开发并不复杂的设备驱动。对于复杂的CMOS、CAN、ETH、HDMI、USB、PCIE这类驱动,只参考内核中实现,修改适配不同的器件都比较困难。大部分教程对于复杂驱动没有详细解释,学习很容易陷入皮毛,这是驱动学习最大的难点。
对于驱动开发的学习,需要深入分析Linux源码,理解执行流程;这部分也可以说是嵌入式开发中最枯燥,困难的部分,积累往往以年为单位,期望短时间内速成基本不可能,很容易从入门到放弃。
📖 开发平台构建
对于平台,则基于芯片的构建环境和产品的功能需求,组合驱动、应用、脚本,实现项目快速迭代和开发编译的工作平台。
平台构建涉及U-Boot、Kernel、Rootfs的启动构建,驱动和应用端的软件编译,快速打包的脚本以及SDK构建方法。过程需要综合Linux各方面的知识细节,才能够完善。
和应用开发和驱动开发不同,平台构建不仅复杂繁琐,而且很难系统总结的问题,比较零碎。关于开发平台构建,从知识点上有些难说清楚,不过实践上反而比较好理解。
这里提出构建I.MX6ULL系统平台的需求,本系列第一、二大章节就提供了解决这个问题所需要的全部知识点,可以带着这个问题来学习思考,也会对开发平台构建有更深入的理解。
平台构建需求:
1. 基于NXP的I.MX6ULL系统官方分支,支持适配开发板。
2. 实现指令进行u-boot、kernel、以及buildroot文件系统编译,打包成img文件。
3. 支持通过SDCard烧录下载后,直接使用的SDK平台。
参考资料:
编译器地址: <https://mirrors.tuna.tsinghua.edu.cn/armbian-releases/_toolchain/>
u-boot地址: <https://github.com/nxp-imx/uboot-imx>
kernel地址: <https://github.com/nxp-imx/linux-imx>
buildroot地址: <https://buildroot.org/download.html>
例如:
./make.sh all # 一键编译u-boot,kernel,buildroot
./make.sh pack # 打包生成sdcard文件,下载可执行
./make.sh qemu # 编译qemu版本的系统,并仿真执行
本系列基于产品开发经验,从整体到局部来进行嵌入式Linux开发的讲解,也是我在产品开发过程中的经验技术总结。
对于平台构建,还有个隐藏的知识点,那就是系统定制和优化;包括功能裁剪,运行时错误检测和修复和故障处理、性能优化等。举个例子: 在外部网络没有问题的情况下,发现接收丢包率高于正常值,请问从哪些角度分析解决?这一部分需要深入探索内核,了解过相关工具才能解决。类似的工作还有很多,将会在涉及到的部分进行解释说明。
整个系列也按照实际构建项目的流程实现,具体如下所示。
🔖 Linux开发平台搭建
🔖 软件安装及交叉编译
🔖 shell脚本语法
🔖 makefile语法
🔖 U-Boot,kernel,文件系统编译构建方法
🔖 驱动开发接口和实现
🔖 嵌入式Linux应用接口和应用开发
嵌入式Linux开发总体来说是服务产品的技术,无论学习什么知识,最终都要落实到具体的产品中,如何学以致用才是最重要的。本系列文档除了自带的测试目录,也有配合的开发项目同步进行实践,具体地址如下。
git clone https://github.com/zc110747/remote_manage.git
对于涉及嵌入式Linux开发应用的产品中,往往也不是单独的嵌入式Linux端设备,可能还有协调了多个基于单片机或DSP开发的子设备,以及上层PC或服务器平台,下面展示典型的嵌入式项目产品架构。
🚀 PC客户端/web端/移动端 - 云端(可选) - 嵌入式linux端 - DSP/MCU/FPGA端
其中嵌入式Linux开发部分主要实现以下功能(可选)。
📚 支持稳定运行的系统平台,包含U-Boot,内核和文件系统的功能实现
📚 用于支持本地应用执行的硬件驱动的开发,如gpio、i2c、spi、hdmi、net、rs485、can这类驱动
📚 用于支持本地应用执行库的移植,如libssl.so、libcrypto.so等
📚 提供本地调试或者客户端功能的第三方应用,如vnc、ssh等
📚 支持管理子设备(包含DSP,MCU,FPGA等)的应用实现,包含不限于:接口驱动、通讯协议、数据管理和应用
📚 提供一套UI界面用于本地界面控制或者信息展示(基于QT、LVGL、Android UI的应用)
📚 局域网访问和管理的服务器,包括不限于http、telnet、snmp协议支持
📚 支持远程访问和管理的网络客户端,如mqtt subcribe/publisher、tcp客户端等
这里展示下基于嵌入式Linux构建的本地应用产品方案。

在现实中,一个完整的嵌入式产品的开发,主要涉及工作包含如下内容。
🚀 建立支持开发的环境
主要由Linux的安装、编译工具的支持(GCC,Makefile)、相应库和工具的安装等组成,实现快速构建的脚本。当然芯片厂商一般都会提供SDK包进行管理,而本系列则是构建完整的SDK包进行产品管理。
🚀 实现稳定的嵌入式系统运行平台
主要由U-Boot,kernel和文件系统的交叉编译支持,包含嵌入式系统的Bringup工作。涉及设备树和驱动的修改、menuconfig配置、以及编译和下载的流程。
这一步主要适配硬件如RAM、ROM、内核、时钟频率以及必要串口的改动,高端的要适配PCIE、NPU的工作支持,完成这一步系统就可以正常运行,进行显示和打印输出。
🚀 嵌入式linux驱动的开发
实现产品运行需要支持的硬件驱动,包括不限于I2C、SPI、RS485、CAN、触摸、USB等。
芯片厂商会在Linux内核基础上提供芯片硬件访问的接口,开发者则将其进一步和外部硬件结合起来,实现完整的嵌入式linux驱动开发。
🚀 嵌入式linux应用开发
应用开发则主要为支持硬件接口访问的Linux应用开发,移植相应的库和运行环境,可以支持使用c/c++,python,nodejs等进行开发。
不过语言只是手段,在之上构建的包含网络、UI显示、数据管理、子系统管理、调试和日志接口才是应用开发的的重点。Linux应用开发主要包含自己实现部分和开源代码集成部分,如果能妥善的使用开源项目,可以大幅度提升开发效率。
本系列也按照上述大章节顺序去讲解。不过从学习的角度,按照此顺序去学习是比较困难的。例如第2章所需要的前置知识是需要在第1、3、4章去了解的。虽然学深入了,这4章节难度上不分上下;但从学习曲线来说,从易到难排列为
🔍 第1部分:Linux平台环境学习和平台构建
🔍 第4部分:嵌入式Linux应用开发
🔍 第3部分:嵌入式Linux驱动开发
🔍 第2部分:嵌入式Linux运行平台构建
对于嵌入式系统的学习,建议先从已经构建好的平台(如国产的各类开源派或开发板已经构建完整的系统),从应用开始,可以快速体验Linux平台开发的乐趣;然后从驱动入手,再通过shell脚本,最终按照个人习惯构建自己的开发平台。
上述讲述了构建嵌入式工作平台的方法,不过对于嵌入式Linux开发来说,还有一个重要部分的就是选择合适的芯片来开始学习。
对于嵌入式来说,开发环境是在芯片选型后确定的,不同芯片的官方构建环境其实差异巨大;这方面国外做的比较好,NXP、TI对于开源主干的支持比较好,可以方便自由构建。国内的瑞芯微、全志也在往这个方向发展,在逐渐进步;不过也有一部分厂商是比较封闭的,不是企业用户,没有芯片厂商的支持基本寸步难行,这类芯片在学习时选择就要谨慎。
不过实际产品中,都是综合价格、稳定性和易用程度统一考量。开发立项后,一般会先确定芯片,然后使用相关开发板作为项目验证原型板;从无到有完全构建全新的项目很少,特别是对于嵌入式Linux这类复杂项目。
目前工业板卡厂商,方案商和培训机构都会提供硬件原理图、编译开发环境、文档以及技术支持服务,在此基础上可以大幅度提高开发效率。
这里展示目前市面上主流的嵌入式Linux软硬件的提供方,主要有以下几类。
📚 培训教学机构,如韦东山、正点原子、野火这类企业培训机构
培训机构的优点是开发板接口丰富,基础功能得齐全,提供资料也全面,开源做的不错,适合入门选择。缺点是资料更新不快,在提供适配某个版本的SDK包和开发文档后,很少有动力去定期更新适配新的版本,价格也相对更贵。不过这些年也在变通推出了一些类似卡片电脑的产品,再配合相应开发板资料,入门阶段可以选择。
📚 专业的板卡方案商,了解的有讯为、飞凌、米尔科技、创龙、瑞莎等
板卡方案商会提供全套使用的SDK方案,支持定制服务。主要是基于官方SDK的二次开发打包,提供可靠的SDK平台以及售后处理。缺点是不提供从无到有构建平台的方法,驱动一般只提供源码,不提供适合学习的文档说明,属于开箱即用的平台,不适合用于学习。
这类产品一般经过全套的认证,适合直接用于产品开发。目前中小型企业产品的主流开发方式,就是基于厂商核心板和用户自行设计底板的组合方式,一般作为公司的产品需求使用。
📚 芯片厂商的验证板,如NXP(I.MX6ULL-EVK)、Ti(TMDSIDK574),这一般叫做厂商原型板
芯片厂商厂商会提供基于此硬件的全套平台方案(包含U-boot,Kernel和Rootfs),很多官方的SDK可以直接拿来使用。缺点是价格昂贵,且官方开发板展示的是厂商主推功能,不一定考虑个体应用的需求,除非是大客户且愿意付相应的服务费,一般没有相应的对接售后服务;当然能保证购买量足够大时,厂商技术直接入驻支持我都见过。
另外对于普通客户,原厂基本不会支持;遇到问题只能在相关论坛提问等待解决,都是大型企业或方案商按需购买,个人和小公司都很少采用此方式
📚 卡片电脑设备商,这一类以树莓派为代表,国内的有香橙派、核桃派等
主要优点是高性价比,以低廉的价格使用高性能的芯片(以多核Cortex-A53,Cortex-A72),带GPU、NPU设计,支持复杂的视频和AI应用。
这种平台大部分都是提供集成好的固件,平台也集成python、gcc、npu等环境,以智能PC的方式操作嵌入式硬件。卡片电脑通常开发应用简单、适合体验嵌入式应用。缺点主要是学习嵌入式Linux驱动和平台构建的话资料不足,可靠性也很难保证。
卡片电脑可以用来学习适应Linux环境,折腾嵌入式应用开发,不适合用于嵌入式Linux学习。当然,如果有动手能力,也可以参考芯片的硬件资料,自己设计开发板。不过这就属于嵌入式硬件,不属于本系列文档的说明的范畴。
另外上述虽然提到了一些厂商,只是因为购买或了解过,并不表示认可,如果真有需求,建议还是进一步收集资料后再选择。毕竟花钱是一方面,浪费时间在不合适的平台上,事倍功半,反而得不偿失。