build_embed_linux_system

前言

嵌入式Linux产品开发是一门综合型的技术,由编译平台构建,运行平台移植,驱动开发,系统环境支持以及应用开发等部分组成。从无到有的完整构建一个项目是十分复杂的过程,需要长期的经验积累。本系列文章从实际项目出发,以上面的脉络流程为框架,讲解嵌入式Linux产品开发涉及的知识。

注意: 受个人水平限制,文章肯定有不足之处,如有发现,希望及时联系反馈(可联系QQ-110747010)。

本节目录如下所示。

summary_notes

嵌入式开发总体上包含应用开发,驱动开发和平台构建部分,具体说明如下。

嵌入式Linux应用开发是实现具体产品的技术;配合硬件平台,通过软件来实现满足具体功能需求的电子产品。除了交叉编译,以及增加对底层硬件的访问外,嵌入式Linux的应用开发和桌面端开发并无本质区别。对于熟悉桌面应用开发的开发者,嵌入式Linux应用开发同样入门简单,也很容易做出可展示的应用。应用开发的例程和资源很多,如Web服务,Qt UI设计,MQTT,SNMP网络应用服务,AI图形检测。理论上都有成熟的开源方案,只要在此基础上实现用户业务即可。应用端根据平台的情况也支持多种开发语言的选择,如C/C++/python/nodejs/java/go/rust等。相对来说入门学习简单,曲线平坦,很适合用来体验嵌入式Linux开发的乐趣。

嵌入式Linux驱动开发的方向则繁杂和困难,按照从底层到内核,包含如下知识。

  1. SOC的内部外设(GPIO、RTC、SPI、I2C、CAN、CSI、HDMI、Video/DRM、Serial、ETH/MII、USB等)
  2. SOC的外部器件(Sensor,CMOS,SDRAM,NAND/NOR Flash,LCD等)
  3. 设备统一模型(总线,设备,驱动接口),设备树和设备树访问接口
  4. U-Boot环境驱动开发支持,实现裸机驱动应用
  5. Kernel环境驱动开发支持,实现系统模块化驱动应用

上述每一部分都步简单,即使掌握了这些技术,大部分情况下也只能开发并不复杂的设备驱动;对于复杂的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开发的讲解,是我在产品开发过程中的经验技术总结,整个系列也按照实际构建项目的流程实现,具体如下所示。

  1. Linux开发平台搭建
  2. 软件安装及交叉编译
  3. shell脚本语法
  4. makefile语法
  5. U-Boot,kernel,文件系统编译构建方法
  6. 驱动开发接口和实现
  7. 嵌入式Linux应用接口和应用开发

support_project

嵌入式Linux开发总体来说是服务产品的技术,无论学习什么知识,最终都要落实到具体的产品中,如何学以致用才是最重要的。本系列文档除了自带的测试目录,也有配合的开发项目同步进行实践,具体地址如下。

git clone https://github.com/zc110747/remote_manage.git

对于涉及嵌入式Linux开发应用的产品中,往往也不是单独的嵌入式Linux端设备,可能还有协调了多个基于单片机或DSP开发的子设备,以及上层PC或服务器平台,下面展示典型的嵌入式项目产品架构。

其中嵌入式Linux开发部分主要实现以下功能(可选)。

  1. 支持稳定运行的系统平台,包含U-Boot,内核和文件系统的功能实现
  2. 用于支持本地应用执行的硬件驱动的开发,如gpio、i2c、spi、hdmi、net、rs485、can这类驱动
  3. 用于支持本地应用执行库的移植,如libssl.so、libcrypto.so等
  4. 提供本地调试或者客户端功能的第三方应用,如vnc、ssh等
  5. 支持管理子设备(包含DSP,MCU,FPGA等)的应用实现,包含不限于:接口驱动、通讯协议、数据管理和应用
  6. 提供一套UI界面用于本地界面控制或者信息展示(基于QT、LVGL、Android UI的应用)
  7. 局域网访问和管理的服务器,包括不限于http、telnet、snmp协议支持
  8. 支持远程访问和管理的网络客户端,如mqtt subcribe/publisher、tcp客户端等

这里展示下基于嵌入式Linux构建的本地应用产品方案。

image

design_project

在现实中,一个完整的嵌入式产品的开发,主要涉及工作包含如下内容.

  1. 建立支持开发的环境

    • 包括不限于Linux的安装,编译工具的支持(GCC,Makefile),相应库和工具的安装,实现快速构建的脚本,当然官方一般都会提供SDK包进行管理,而本系列则是构建一个全新的SDK包进行产品管理。
  2. 实现稳定的嵌入式linux运行平台

    • 包括U-Boot,kernel和文件系统的完善支持,包含嵌入式linux系统的Bringup工作,这里涉及设备树和驱动的修改,menuconfig配置,以及编译和下载的流程。这一步主要适配RAM、ROM、内核、时钟频率以及必要串口的改动,高端的要适配PCIE等接口,完成这一步系统就可以正常运行,显示和打印输出。
  3. 嵌入式linux驱动的开发

    • 实现产品运行需要支持的硬件驱动,包括不限于I2C、SPI、RS485、CAN、触摸、USB等,芯片厂商会提供芯片硬件访问的接口,开发者则将其与Linux内核结合起来,实现嵌入式linux驱动开发。
  4. 嵌入式linux应用开发

    • 应用开发则主要为支持硬件接口访问的Linux应用开发,移植相应的库和运行环境,可以支持使用c/c++,python,nodejs等进行开发。不过语言只是手段,在之上构建的包含网络、UI显示、数据管理、子系统管理、调试和日志接口才是应用开发的的重点。Linux应用开发主要包含自己实现部分和开源代码集成部分,如果能妥善的使用开源项目,可以大幅度提升开发效率。

本系列也按照上述大章节顺序去讲解。不过从学习的角度,按照此顺序去学习是比较困难的。例如第2章所需要的前置知识是需要在第1,3,4章去了解的。虽然学深入了,这4章节难度上不分上下。但从学习曲线来说,从易到难排列为第1章=>第3章=>第4章=>第2章。所以学习时也建议先从已经构建好的平台(如国产的各类开源派或开发板已经构建完整的系统),从应用开始,可以快速体验Linux平台开发的乐趣,然后从驱动入手,再通过shell脚本,最终按照个人习惯构建自己的开发平台。

对于嵌入式Linux开发来说,另一个重要部分的就是选择合适的芯片来开始学习。开发环境是在芯片选型后确定的,开发立项后,一般会使用指定开发板作为项目验证原型板,从无到有完全构建全新的项目很少,特别是对于嵌入式Linux的复杂项目。目前工业板卡厂商,方案商和培训机构都会提供硬件原理图,编译开发环境,文档和技术支持服务,在此基础上可以大幅度提高开发效率。这里展示目前市面上主流的嵌入式Linux软硬件方案商,主要有以下几类。

  1. 培训教学机构,如韦东山,正点原子,野火等。提供资料丰富,知识面广,而且资料开源做的很好,适合入门选择。缺点是资料更新一般很慢,有完整的SDK包后,很少有动力去更新适配最新的版本,适合希望入门或者刚入行的新人购买。
  2. 专业的板卡方案商,如讯为,飞凌,米尔科技,创龙等。提供全套使用的SDK方案,支持定制服务。不过提供资料往往已经是完整平台,只支持问题反馈处理,不提供从无到有构建平台的方法,不适合用于入门学习。但是这类产品一般经过全套的认证,适合直接用于产品开发。目前主流是厂商核心板和用户自行设计底板的组合方式,作为公司的产品需求使用。
  3. 芯片厂商的验证板,如NXP(I.MX6ull-evk),Ti(TMDSIDK574),这一般叫做厂商原型板。优点厂商会提供基于此硬件的全套平台方案(包含U-boot,Kernel和Rootfs),很多官方的SDK可以直接拿来使用。缺点是价格昂贵,且官方开发板展示的是厂商主推功能,不一定考虑个体应用的需求。另外对于一般客户,如果遇到问题是没有客服对接的,基本只能论坛提问等待解决,一般都是大型企业或者方案商按需购买,个人和小公司都很少会采购。
  4. 卡片电脑设备商,这一类以树莓派为代表,国内的有香橙派,核桃派等,特点是使用高性能的芯片(以多核Cortex-A53,Cortex-A72)为主,带GPU,NPU设计,支持复杂的视频和AI应用。这种平台大部分都是提供集成好的固件,平台也集成python,g++,chrome等环境或应用,以智能PC的方式操作嵌入式硬件。开发简单,适合体验嵌入式应用,不过用于学习嵌入式Linux驱动和平台构建的话则资料不足,另外可靠性也很难保证。这类卡片电脑可以用来学习适应Linux环境,折腾嵌入式应用。

当然,如果有动手能力,也可以参考芯片的硬件资料,自己设计开发板。不过这就属于嵌入式硬件,不属于本系列文档的说明的范畴。另外上述虽然提到了一些厂商,只是因为购买或了解过,并不表示认可,如果真有需求,建议还是进一步收集资料后再选择。毕竟花钱是一方面,浪费时间在不合适的平台上,事倍功半,反而得不偿失。

next_chapter

返回目录

直接开始下一章节:构建Linux开发平台环境