嵌入式Linux产品开发是一门综合型的技术,由编译平台构建,运行平台移植,驱动开发,系统环境支持以及应用开发等部分组成。从无到有的完整构建一个项目是十分复杂的过程,需要长期的经验积累。本系列文章从实际项目出发,以上面的脉络流程为框架,讲解嵌入式Linux产品开发涉及的知识。
注意: 受个人水平限制,文章肯定有不足之处,如有发现,希望及时联系反馈(可联系QQ-110747010)。
本节目录如下所示。
嵌入式开发总体上包含应用开发,驱动开发和平台构建部分,具体说明如下。
嵌入式Linux应用开发是实现具体产品的技术;配合硬件平台,通过软件来实现满足具体功能需求的电子产品。除了交叉编译,以及增加对底层硬件的访问外,嵌入式Linux的应用开发和桌面端开发并无本质区别。对于熟悉桌面应用开发的开发者,嵌入式Linux应用开发同样入门简单,也很容易做出可展示的应用。应用开发的例程和资源很多,如Web服务,Qt UI设计,MQTT,SNMP网络应用服务,AI图形检测。理论上都有成熟的开源方案,只要在此基础上实现用户业务即可。应用端根据平台的情况也支持多种开发语言的选择,如C/C++/python/nodejs/java/go/rust等。相对来说入门学习简单,曲线平坦,很适合用来体验嵌入式Linux开发的乐趣。
嵌入式Linux驱动开发的方向则繁杂和困难,按照从底层到内核,包含如下知识。
上述每一部分都步简单,即使掌握了这些技术,大部分情况下也只能开发并不复杂的设备驱动;对于复杂的CMOS、CAN、ETH、HDMI、USB、PCIE这类驱动,只参考内核中实现,修改适配不同的器件都比较困难。大部分教程对于复杂驱动没有详细解释,学习很容易陷入皮毛,这是驱动学习最大的难点。深入分析Linux源码,理解执行流程是必要路径,当然这部分也可以说是嵌入式驱动开发中最枯燥,困难的部分。这方面的积累往往以年为单位,期望短时间内速成基本不可能,很容易从入门到放弃。
对于平台,则基于芯片的构建环境和产品的功能需求,组合驱动,应用,脚本,实现项目快速迭代和开发编译的工作平台。这里面涉及U-Boot,Kernel,Rootfs的启动构建,驱动和应用端的软件编译,快速打包方案的脚本和SDK构建方法。需要综合Linux各方面的知识细节,才能够完善。和应用开发和驱动开发不同,平台构建是复杂繁琐,但是又很难系统总结的问题,比较零碎,那么这里就提个需求,可以通过解决这个需求来理解什么是平台构建。
问题:
基于NXP的I.MX6ULL系统官方分支,进行移植配置,实现指令进行u-boot,kernel,以及buildroot文件系统编译,打包成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开发总体来说是服务产品的技术,无论学习什么知识,最终都要落实到具体的产品中,如何学以致用才是最重要的。本系列文档除了自带的测试目录,也有配合的开发项目同步进行实践,具体地址如下。
git clone https://github.com/zc110747/remote_manage.git
对于涉及嵌入式Linux开发应用的产品中,往往也不是单独的嵌入式Linux端设备,可能还有协调了多个基于单片机或DSP开发的子设备,以及上层PC或服务器平台,下面展示典型的嵌入式项目产品架构。
其中嵌入式Linux开发部分主要实现以下功能(可选)。
这里展示下基于嵌入式Linux构建的本地应用产品方案。
在现实中,一个完整的嵌入式产品的开发,主要涉及工作包含如下内容.
建立支持开发的环境
实现稳定的嵌入式linux运行平台
嵌入式linux驱动的开发
嵌入式linux应用开发
本系列也按照上述大章节顺序去讲解。不过从学习的角度,按照此顺序去学习是比较困难的。例如第2章所需要的前置知识是需要在第1,3,4章去了解的。虽然学深入了,这4章节难度上不分上下。但从学习曲线来说,从易到难排列为第1章=>第3章=>第4章=>第2章。所以学习时也建议先从已经构建好的平台(如国产的各类开源派或开发板已经构建完整的系统),从应用开始,可以快速体验Linux平台开发的乐趣,然后从驱动入手,再通过shell脚本,最终按照个人习惯构建自己的开发平台。
对于嵌入式Linux开发来说,另一个重要部分的就是选择合适的芯片来开始学习。开发环境是在芯片选型后确定的,开发立项后,一般会使用指定开发板作为项目验证原型板,从无到有完全构建全新的项目很少,特别是对于嵌入式Linux的复杂项目。目前工业板卡厂商,方案商和培训机构都会提供硬件原理图,编译开发环境,文档和技术支持服务,在此基础上可以大幅度提高开发效率。这里展示目前市面上主流的嵌入式Linux软硬件方案商,主要有以下几类。
当然,如果有动手能力,也可以参考芯片的硬件资料,自己设计开发板。不过这就属于嵌入式硬件,不属于本系列文档的说明的范畴。另外上述虽然提到了一些厂商,只是因为购买或了解过,并不表示认可,如果真有需求,建议还是进一步收集资料后再选择。毕竟花钱是一方面,浪费时间在不合适的平台上,事倍功半,反而得不偿失。
直接开始下一章节:构建Linux开发平台环境