ARM-Linux入门整体介绍

Tutorial: 卓越工程师 Category: 嵌入式 Published: 2026-10-23 11:05:29 Views: 1 Likes: 0 Comments: 0

318.1.1ARM-Linux入门整体介绍

一、ARM-Linux完全入门

本节是后续 ARM-Linux 入门课程的总览,没有编写或展示 C 源码,因此标题下不添加代码块。视频先演示最终项目,再依次介绍“准备部分、Linux 基础命令、环境搭建、系统编译、驱动入门、应用入门”六部分。学习主线不是孤立地背命令,而是把一个程序从主机端编译、传到开发板、调用内核驱动、访问硬件,最后在串口终端和 OLED 上看到结果的全过程走通。

这套课程中的三台“机器”及其角色可以先记成:

Windows 主机
├─ 运行 VMware 和串口/文件传输工具
└─ VMware 虚拟机:Ubuntu(Linux 开发主机)
   ├─ 编辑、编译源码
   ├─ 生成面向 ARM 的程序和系统组件
   └─ 通过网络或共享机制把文件送往开发板
                      ↓
              iTOP-i.MX6ULL 开发板
              ├─ 运行 U-Boot 与 Linux
              ├─ 内核驱动访问 MPU6050、OLED 等硬件
              └─ 用户空间应用读取数据并输出结果

这里的 Ubuntu 是一个 Linux 发行版,VMware 是虚拟化软件;“Ubuntu”“Linux”和“虚拟机”不是同一个概念。开发板也在运行 Linux,但它与虚拟机的处理器架构、硬件资源和用途不同。

1.1 实验展示

1.1.1 课程的六部分

视频思维导图中的课程结构如下:

部分解决的问题在最终实验中的作用
准备部分安装 VMware、Ubuntu,并准备软件和系统镜像获得可用的 Linux 开发主机
Linux 基础命令文件、用户、软件、文本、查找、编译和进程等基本操作能在终端中完成后续开发工作
环境搭建配置文件传输、网络、SSH 和交叉编译工具链打通 Windows、Ubuntu 与开发板
系统编译认识并编译 U-Boot、Linux 内核、设备树和根文件系统让板卡具备可启动、可调试的系统环境
驱动入门学习内核模块、字符设备、I²C 与设备树让 Linux 内核能够管理 MPU6050 和 OLED
应用入门在用户空间调用驱动并组织业务逻辑读取传感器、计算/整理数据并输出到终端和 OLED

思维导图上各分支后面的数字是该导图的子主题数量提示,不是课时数、实验数量或难度评分。

1.1.2 视频实际演示了什么

画面中的载板丝印为 TOPEET TERMINATOR V1.1,核心板丝印为 I.MX6ULL。因此原笔记的“i.MX 6UL”应改为 iTOP-i.MX6ULL 终结者开发板。i.MX 6ULL 是 NXP 的单核 Arm Cortex-A7 应用处理器系列;具体板卡所用处理器频率、内存和存储容量仍应以该板型号和物料版本为准,不能只凭系列名称推断。

演示流程是:

  1. Windows 中的 MobaXterm 打开 USB-SERIAL CH340 (COM10) 串口会话,进入开发板的 root shell。
  2. 在提示符 # 后输入 ./app,启动当前目录下名为 app 的可执行文件。
  3. 终端先出现 oled open、mpu6050_open 一类内核日志,随后循环输出 AX/AY/AZ、GX/GY/GZ 和 Pitch/Roll/Yaw。
  4. 教师移动开发板,屏幕上的数值随姿态变化;小型 OLED 同时显示结果。
  5. 按 Ctrl+C 终止程序,终端显示 ^C,随后出现 mpu6050_release 日志。

几个终端细节需要正确理解:

  • # 是 root 用户常见的 shell 提示符,不是命令的一部分。root 权限很高,误操作可能修改或删除系统文件。
  • ./app 中的 ./ 表示“当前目录”。Linux shell 通常不会自动到当前目录寻找程序,所以只输入 app 未必能找到它。
  • Ctrl+C 通常向前台进程发送中断信号,请求结束程序;它不是“删除程序”。
  • COM10 和 CH340 是这次 Windows 电脑识别到的串口及 USB 转串口设备,换一台电脑后端口号可能变化。
1.1.3 MPU6050、I²C 与两种输出

MPU-6050 内含三轴加速度计和三轴陀螺仪,是六轴运动传感器;它没有磁力计。视频中的输出可按下面的链路理解:

MPU6050
  │ I²C:SCL 时钟线 + SDA 数据线
  ▼
i.MX6ULL 的 I²C 控制器 → Linux I²C/设备驱动 → 用户空间 app
                                               ├─ 串口终端:打印数值
                                               └─ OLED:显示数值

I²C 是开发板与外设通信的总线,不是“把数据打印到串口”的协议。串口终端和 OLED 是应用的两个输出去向;视频没有展示两者的完整接线、总线编号、从设备地址或初始化代码,不能据此补写具体引脚和地址。

I²C 一般以 SCL、SDA 两根信号线连接多个带地址的从设备,信号线通常还需要与电压匹配的上拉电阻。Linux 既可以使用 SoC 的硬件 I²C 控制器,也可以在特定配置下用 GPIO 模拟 I²C,但本节只做总览,没有证据表明该演示采用了哪一种,原笔记的“硬件或软件 I²C”不应写成已确认的实验事实。

输出字段的含义是:

字段较严谨的理解本节不能确定的内容
AX、AY、AZ三轴加速度相关读数是原始寄存器值还是换算值、量程和单位
GX、GY、GZ三轴角速度相关读数是原始寄存器值还是换算值、量程和单位
Pitch、Roll、Yaw程序根据传感器数据计算的姿态量算法、坐标系、滤波方法、角度单位和校准状态

Pitch/Roll/Yaw 不是 MPU6050 额外三个传感器直接测得的寄存器值。尤其是 MPU6050 没有磁力计,若只依赖加速度计和陀螺仪,偏航角通常会受到陀螺仪零偏积分漂移影响。由于本节没有展示算法源码和标定过程,只能确认“移动板卡时数值会变化”,不能进一步宣称精度、单位或长期稳定性。

1.1.4 学习目标的合理边界

教师用已经接触过的 I²C、MPU6050 和 OLED 来降低迁移门槛,并强调把一个完整实验学深,而不是追求很多零散实验。这里的“完全入门”应理解为:能够独立说清并实践从环境准备到驱动、应用和现象验证的端到端流程。

完成一个实验并不等于已经掌握整个 Linux 内核、所有设备驱动或产品级硬件设计。真正的入门验收至少应包括:能够复现流程、解释每层职责、定位常见错误,并能根据日志和测量证据判断问题发生在工具链、文件传输、启动、驱动、应用还是硬件连接。

1.2 准备部分

1.2.1 虚拟机安装Ubuntu

本课程采用的关系是“Windows 主机上运行 VMware,VMware 中安装 Ubuntu 客户机”。Ubuntu 虚拟机为编译和工具运行提供 Linux 环境,但它不是 ARM 开发板的模拟器,也不会仅因安装 Ubuntu 就自动具备 i.MX6ULL 的硬件和驱动。

安装时应重点记录:

  • VMware 与 Ubuntu 的具体版本,以及课程 BSP 对主机版本的要求;旧 BSP 可能依赖特定编译器和软件包。
  • 分配给虚拟机的 CPU、内存和磁盘空间;编译内核和根文件系统通常比练习基础命令需要更多空间。
  • 网络模式(桥接、NAT 等)、虚拟机 IP 地址及其与开发板网络的可达性。
  • 重要快照或备份点,便于环境配置失败时恢复,但快照不能替代项目文件备份。
  • VMware 安装包与许可证应从官方或获授权的渠道取得;视频思维导图中的非授权激活提示不属于技术学习步骤,不应照做。
1.2.2 Linux基础命令

思维导图列出的基础内容很多,可按任务分类学习:

类别代表内容要达到的能力
路径与文件pwd、ls、cd、mkdir、touch、cp、mv、rm知道当前所在位置,安全地创建、复制、移动和删除文件
查看与编辑cat、文本编辑器、重定向阅读和修改配置、源码及日志
查找与诊断find、grep、dmesg找文件、搜文本、查看内核信息
用户与权限普通用户、root、sudo、chmod理解身份和权限,不滥用 root
软件与压缩apt、常见归档/压缩工具安装依赖,解压 BSP 和工具链
网络与进程ifconfig/现代系统中的 ip、ping、ps、top、kill检查网络和进程状态
编译与执行GCC、file、可执行权限、./程序名区分源码、目标文件和不同架构的可执行文件

学习重点不是机械背诵全部选项,而是反复完成“查看当前位置—操作文件—检查结果—读错误信息”的闭环。删除、改权限、结束进程或以 root 执行命令前,应先确认目标对象;“跟两遍”只是教师给出的学习建议,不是保证掌握的次数。

1.2.3 环境搭建

环境搭建的核心是让 Windows、Ubuntu 和开发板之间能够通信,并明确每种工具解决哪一段链路:

方式常见用途关键边界
VMware 共享文件夹Windows 主机与 Ubuntu 客户机交换文件依赖 VMware Tools;不能直接等同于 Ubuntu 与开发板的传输
Samba/SMB把 Ubuntu 目录共享给 Windows 访问适合局域网文件共享,需要正确设置用户、权限和防火墙
SCP通过 SSH 在主机与开发板之间加密复制文件两端网络可达,目标端要有 SSH 服务和相应权限
FTP课程环境中的传统文件传输普通 FTP 的认证和数据默认不加密,不适合不可信网络
SSH远程登录并在目标机执行命令它是远程 shell;SCP/SFTP 是相关的文件传输用途,概念不要混为一谈

配置时应先画清数据流,再检查 IP 地址、子网、网卡模式、防火墙、服务是否启动以及目标目录权限。例如,要把 Ubuntu 中的 ARM 程序复制到开发板,VMware 共享文件夹只能帮助文件进入 Ubuntu;Ubuntu 到开发板仍需 SCP、FTP、NFS 或课程指定的其他通道。

1.2.4 系统编译
1.2.4.1 什么是交叉编译

交叉编译是“在一种平台上生成供另一种平台运行的程序”。本课程中通常是:

构建平台:x86_64 Ubuntu 虚拟机
        │ 使用 arm-linux-gnueabihf-* 工具链
        ▼
目标平台:基于 Arm 的 i.MX6ULL 开发板

视频导图展示的课程工具链包名包含 gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf,并演示用 arm-linux-gnueabihf-gcc 检查工具。这个版本是课程 BSP 的配套环境,不代表任何项目都应选它,也不应盲目替换成最新版。内核、U-Boot、C 库、根文件系统和应用所用 ABI 必须相互兼容。交叉编译生成的 ARM 程序通常不能在 x86_64 Ubuntu 上原生执行,可先用 file 等工具检查其架构,再传到开发板运行。

1.2.4.2 U-Boot、内核、设备树和根文件系统

原笔记称它们为“板子运行的四个文件”,过于绝对。更准确地说,它们是嵌入式 Linux 启动链中的四类关键组件/产物:

组件主要职责常见形态或内容
U-Boot初始化必要硬件,选择启动介质和参数,把内核、设备树等装入内存并启动本课程可生成 u-boot.imx;实际文件名依板级配置而异
Linux 内核管理 CPU、内存、进程和设备,运行内核驱动i.MX6ULL 常见构建产物可为 zImage,以 BSP 为准
设备树用层次化数据描述板上硬件、地址、中断、GPIO、总线和兼容字符串等DTS/DTSI 是源码,编译后的 DTB 供启动时传给内核;它不是可执行驱动
根文件系统提供用户空间目录、库、程序、配置以及 init 系统可表现为目录树、压缩包或适配介质的文件系统镜像,不一定只是一个普通文件

典型启动关系可概括为:

SoC Boot ROM → U-Boot → 装载 Linux 内核 + DTB
                         ↓
                  内核初始化并挂载根文件系统
                         ↓
                  启动 init/服务/用户程序

开发板要正常启动,需要启动介质或网络位置上存在彼此匹配的必要组件,但这不意味着每改一行应用代码都必须重新编译并烧写四项。板卡通常已有可用系统;修改普通应用只需重新构建、传输和运行应用,修改驱动可能只需更新模块,修改设备树则更新 DTB。是否需要重刷内核、U-Boot 或整个文件系统,要由改动范围和课程流程决定。

单片机与 Linux 板卡的对比也应避免绝对化:简单 MCU 工程经链接后常烧录一个 HEX/BIN 映像,ELF 常同时承载调试信息;但 MCU 也可能有 bootloader、多个映像和文件系统。Linux 板卡的关键区别是启动和运行环境更分层,并非“MCU 永远只有一个文件、Linux 永远固定四个文件”。

1.2.4.3 烧写与调试启动

视频后续路线包含烧写工具以及 TFTP、NFS、网络和 U-Boot 环境变量等调试配置。两类流程应区分:

  • 烧写/量产式启动:把系统组件写入 SD、eMMC、NAND 等非易失介质,断电后仍可从介质启动。
  • 网络调试启动:常由 U-Boot 通过 TFTP 临时装载内核/DTB,再让内核通过 NFS 使用根文件系统;便于频繁更新,但依赖正确的网络、服务器路径和启动参数。

课程画面提到的 MfgTool、串口波特率 115200、桥接网络和 U-Boot 环境变量都是具体教学环境的配置项。使用前要核对板卡版本及官方 BSP,不能把某一套镜像、地址或烧写参数直接套到其他开发板;烧错启动介质或中途断电可能使板卡无法从原介质启动。

1.2.5 驱动入门

Linux 中较清晰的分层是:

用户空间应用 app
  │ open/read/write/ioctl 等系统调用或已有子系统接口
  ▼
内核驱动(字符设备、I²C 子系统中的设备驱动等)
  │ 根据设备树和总线信息匹配、管理设备
  ▼
i.MX6ULL I²C 控制器 ── SDA/SCL ── MPU6050 / OLED

视频导图预告了网络设备驱动、内核模块的入口/退出与许可证、字符设备、I²C、设备树,以及 MPU6050、OLED 驱动。这些是后续课程内容,本节没有展示驱动源文件,不能在此补写实现代码。

原笔记把“手写 I²C 时序”概括为驱动、把从中景园资料移植的 OLED 代码概括为应用,这是教师借用单片机经验所做的入门类比,不是所有场景都适用的严格定义:

  • 在裸机 MCU 项目中,GPIO 时序、外设访问、显示库和业务逻辑可能最终链接进同一个固件,但仍可以按 BSP/HAL/驱动/应用分层组织。
  • 在 Linux 中,直接管理硬件资源的代码通常位于内核驱动,用户程序通过稳定接口访问设备;二者的地址空间、权限、构建方式和故障影响不同。
  • “驱动与应用分开”描述的是清晰的接口边界,不表示两者毫无关系。应用必须按驱动公开的接口工作,驱动的设备节点、数据格式和控制命令会直接影响应用。
  • 设备树负责描述硬件并帮助内核匹配驱动,不会代替驱动执行 I²C 读写。

画面中的 oled open、mpu6050_open 和退出后的 mpu6050_release 表明演示程序触发了相应设备的打开/释放路径;但仅凭日志无法确定具体设备节点名、函数实现和错误处理逻辑。

1.2.6 应用入门

应用层的目标是调用内核提供的设备接口,取得 MPU6050 数据,按需要完成换算或姿态计算,然后把结果打印到串口终端并写到 OLED。常见流程可以概念化为:

打开设备 → 配置/初始化 → 循环读取 → 换算或计算 → 终端与 OLED 输出 → 关闭设备

这是流程说明,不是本节源码。实际程序是否使用 open/read/write/ioctl 中的全部接口、怎样滤波、怎样刷新 OLED,必须以后续展示的真实源码为准。

本节的合格学习结果不是“记住 ./app 后看到数字”,而是能够回答:

  1. 程序在哪台机器上编译,为什么需要交叉工具链?
  2. 程序怎样从 Windows/Ubuntu 到达开发板?
  3. U-Boot、内核、设备树和根文件系统各负责什么?
  4. 应用为什么不直接在用户空间随意操作 I²C 寄存器?
  5. MPU6050 的六轴原始信息与 Pitch/Roll/Yaw 有什么区别?
  6. 串口没有日志、驱动打不开、数值不变或 OLED 不显示时,应分别从哪一层开始排查?

能复现并解释上述链路,才达到了这套课程所说的 ARM-Linux 端到端入门;更复杂的内核机制、设备模型、并发、电源管理和产品化可靠性仍需要继续学习。

二、本节学习顺序与检查点

建议按依赖关系推进,而不是同时配置所有工具:

  1. **先认识环境。**分清 Windows 主机、Ubuntu 虚拟机和 ARM 开发板,记录版本、IP 和串口信息。
  2. **练基本操作。**能在 Ubuntu 中创建、查找、编辑、编译和检查文件,并理解用户权限。
  3. **打通传输。**先完成 Windows 与 Ubuntu,再完成 Ubuntu 与开发板;每一步都用文件大小或校验值确认结果。
  4. **验证交叉编译。**用配套工具链构建一个最小程序,通过 file 确认目标架构,再到板端运行。
  5. **理解启动链。**能指出 U-Boot、内核、DTB、根文件系统分别位于哪里,以及失败时能看到什么日志。
  6. **再学驱动与应用。**先验证设备树匹配和驱动探测,再验证设备接口,最后运行综合应用;不要一看到 OLED 不亮就直接修改所有层。
  7. **以证据验收。**保存编译输出、传输结果、串口启动日志、内核日志和传感器现象,区分“程序运行了”与“数据正确且稳定”。

排查时可沿数据链逐段定位:

工具链/编译产物
       ↓
文件是否传到正确位置、是否有执行权限
       ↓
系统和 DTB 是否匹配板卡、驱动是否 probe 成功
       ↓
I²C 总线、地址、供电和接线是否正确
       ↓
应用是否正确打开、读取、换算和输出
       ↓
串口终端与 OLED 是否分别正常

核对依据

  • 本地 videos/318.1.1ARM-Linux入门整体介绍.mp4:逐段核对六部分思维导图、iTOP-i.MX6ULL 终结者板卡丝印、MobaXterm 的 CH340/COM10 串口、./app 命令、终端字段、移动板卡时的数据变化、OLED 显示及退出日志;视频时长约 8 分 16 秒。
  • 本地 transcripts/318.1.1ARM-Linux入门整体介绍.txt 与 .srt:核对教师对课程路线、虚拟机、基础命令、文件传输、交叉编译、四类系统组件、烧写/调试、驱动与应用的口述;并结合画面纠正转录中的 I²C、MPU6050、OLED、VMware、Ubuntu、Keil、设备树等识别错误。
  • 迅为电子 i.MX6ULL 开发板官方页面及资料下载页:核对 iTOP-i.MX6ULL“终结者”开发板名称、处理器系列、板载接口和配套 BSP/工具链背景。
  • NXP i.MX 6ULL 官方产品页:核对 i.MX 6ULL 为单核 Arm Cortex-A7 应用处理器系列;系列最高规格不直接等同于视频中具体板卡参数。
  • TDK InvenSense《MPU-6000/MPU-6050 Product Specification》:核对 MPU-6050 的三轴陀螺仪、三轴加速度计和 I²C 接口,确认它本身不含磁力计。
  • Linux 内核 Device Tree Usage 文档:核对设备树用于描述硬件、把板级硬件配置与内核驱动支持解耦,以及启动时向内核提供设备树的角色。
  • U-Boot bootz 文档及bootm 文档:核对 U-Boot 启动 Linux 时内核、可选 initrd 与 FDT/DTB 的装载关系,避免把四类组件误写成每次都必须重刷的“四个普通文件”。
  • GNU Automake Cross-Compilation 文档:核对交叉编译中构建平台与产物运行平台的区别,以及交叉工具常用目标架构前缀的命名方式。