第一章:嵌入式Linux与英伟达平台概述

大家好,我是你们的讲师。今天咱们聊聊嵌入式Linux和英伟达平台的那些事儿。说实话,这个领域我摸爬滚打了快十年,踩过的坑比走过的路还多。不过别担心,我会把经验都抖出来。

1.1 嵌入式Linux系统简介

嵌入式Linux,说白了就是跑在专用硬件上的Linux。跟桌面版不一样,它得为特定任务优化。我刚开始接触时,总觉得它跟Ubuntu差不多,结果一上手就发现——嗯,完全不是那么回事。

嵌入式Linux有几个关键特点:

  • 资源受限:内存、存储、CPU都有限制。我见过只有128MB内存的设备,照样跑得飞起。
  • 实时性要求:很多场景需要毫秒级响应。比如自动驾驶,你想想看,延迟一秒会怎样?
  • 定制化强:从内核到文件系统,几乎每个组件都能裁剪。我习惯用Yocto或Buildroot来构建。
  • 驱动是关键:没有驱动,硬件就是一堆废铁。这也是咱们课程的核心。

核心概念:嵌入式Linux = Linux内核 + 根文件系统 + Bootloader + 设备驱动。缺一不可。

为什么会这样?因为嵌入式设备不像PC,没有统一的标准。每个板子都有自己的外设、内存映射、中断控制器。驱动开发,就是让Linux认识这些硬件。

1.2 英伟达Jetson系列硬件平台介绍

英伟达的Jetson系列,是嵌入式AI计算的标杆。我最早接触的是Jetson TK1,那时候还是32位的。现在都到Orin了,性能翻了不知道多少倍。

咱们来看看主流型号:

型号 AI算力 CPU GPU 内存 典型应用
Jetson Nano 472 GFLOPS 4核Cortex-A57 128核Maxwell 4GB 入门级AI、机器人
Jetson TX2 1.33 TFLOPS 6核(A57+Denver2) 256核Pascal 8GB 无人机、工业相机
Jetson Xavier NX 21 TOPS 8核Carmel 384核Volta 8/16GB 边缘计算、智能安防
Jetson Orin NX 70 TOPS 8核Cortex-A78AE 1024核Ampere 8/16GB 自动驾驶、高端机器人

我个人建议,初学者从Jetson Nano入手。便宜、资料多、社区活跃。我在项目中用过TX2和Xavier NX,说实话,Orin的性能确实让人惊艳,但价格也让人心疼。

小提示:选平台时,别只看算力。要考虑功耗、接口、散热。我见过有人用Orin做手持设备,结果散热问题搞了三个月。

1.3 驱动开发环境搭建

环境搭建,是驱动开发的第一步。也是很多人卡住的地方。我刚开始时,光交叉编译工具链就折腾了两天。现在想想,其实没那么复杂。

1.3.1 交叉编译工具链

交叉编译,就是在PC上编译出能在ARM上运行的代码。为什么不用直接在板子上编译?你想想看,Jetson Nano的CPU才4核A57,编译一个内核要几个小时。PC上十几分钟搞定。

英伟达官方提供了L4T(Linux for Tegra)工具链。安装很简单:

# 下载L4T工具链
wget https://developer.nvidia.com/embedded/l4t/r32_release_v7.1/toolchain/aarch64--glibc--stable-final.tar.gz

# 解压到指定目录
sudo tar -xvf aarch64--glibc--stable-final.tar.gz -C /opt

# 设置环境变量
export CROSS_COMPILE=/opt/aarch64--glibc--stable/bin/aarch64-linux-gnu-
export ARCH=arm64

我曾经犯过一个低级错误——忘记设置ARCH=arm64。结果编译出来的内核是x86_64的,烧到板子上直接起不来。嗯,这种坑踩一次就记住了。

警告:工具链版本必须与内核版本匹配。L4T R32对应内核4.9,L4T R35对应内核5.10。混用会导致编译错误。

1.3.2 SDK Manager

SDK Manager是英伟达的官方工具,用来刷机、安装依赖、部署SDK。说实话,这工具帮了大忙。以前刷Jetson TK1,得手动分区、烧写、配置网络,搞一整天。现在点几下鼠标就行。

使用步骤:

  1. 下载SDK Manager:从英伟达官网下载,需要注册账号。
  2. 连接硬件:用USB线连接Jetson板子和PC。板子进入恢复模式(按住RECOVERY键,再按RESET键)。
  3. 选择配置:选择硬件型号、目标操作系统、需要安装的组件(CUDA、cuDNN、TensorRT等)。
  4. 开始刷机:点击Flash,等待20-30分钟。期间别断电,别拔USB线。

我习惯在刷机前,先准备好网络环境。SDK Manager需要下载大量文件,网络不好会超时。有一次我在客户现场,网络只有2Mbps,刷了整整一个下午。

避坑指南:我曾经因为USB线质量差,导致刷机反复失败。后来换了根带屏蔽的USB 3.0线,一次成功。线材很重要,别省那几十块钱。

1.3.3 验证环境

环境搭好后,得验证一下。写个简单的驱动模块,编译、加载、卸载,看看能不能正常工作。

// hello.c
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void)
{
    printk(KERN_INFO "Hello, Jetson!\n");
    return 0;
}

static void __exit hello_exit(void)
{
    printk(KERN_INFO "Goodbye, Jetson!\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

编译命令:

make -C /path/to/kernel M=$(pwd) modules

把生成的hello.ko拷贝到板子上,加载:

sudo insmod hello.ko
sudo rmmod hello.ko
dmesg | tail -5

如果看到"Hello, Jetson!"和"Goodbye, Jetson!",说明环境没问题。我第一次看到这个输出时,激动得差点跳起来。虽然只是个hello world,但意味着整个工具链、内核源码、编译环境都通了。

小技巧:建议用NFS或SSH传输文件,别老插拔SD卡。我习惯在板子上挂载PC的NFS目录,开发效率高很多。

好了,第一章就到这里。环境搭好了,后面咱们就能真正开始写驱动了。记住,环境搭建是基础,基础不牢,地动山摇。下一章,咱们聊聊设备树——驱动开发的骨架。