第一章:嵌入式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,得手动分区、烧写、配置网络,搞一整天。现在点几下鼠标就行。
使用步骤:
- 下载SDK Manager:从英伟达官网下载,需要注册账号。
- 连接硬件:用USB线连接Jetson板子和PC。板子进入恢复模式(按住RECOVERY键,再按RESET键)。
- 选择配置:选择硬件型号、目标操作系统、需要安装的组件(CUDA、cuDNN、TensorRT等)。
- 开始刷机:点击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目录,开发效率高很多。
好了,第一章就到这里。环境搭好了,后面咱们就能真正开始写驱动了。记住,环境搭建是基础,基础不牢,地动山摇。下一章,咱们聊聊设备树——驱动开发的骨架。