第2章 开发环境搭建:交叉编译、CANN SDK 与工具链
说实话,做嵌入式开发最怕什么?不是代码写不出来,而是环境搭了半天,最后发现编译器版本不对、头文件路径配错、SDK 没装全。我见过太多新手卡在这一步,一卡就是两三天。所以这一章,咱们把环境彻底捋清楚。
Atlas 200 DK 是 ARM 架构的 AI 加速模块,而我们日常开发用的 PC 通常是 x86 架构。这就意味着——你不能直接在 PC 上编译完扔上去跑。必须用交叉编译。说白了,就是在 x86 机器上生成 ARM 的可执行文件,然后传到开发板上运行。
2.1 交叉编译环境配置
我个人习惯在 Ubuntu 18.04 或 20.04 上做开发。为什么?因为华为官方提供的 CANN 套件对这两个版本支持最稳。你非要用 22.04 也不是不行,但有些依赖库得自己折腾,我建议你省下这个时间。
首先,安装交叉编译器。Atlas 200 DK 的 CPU 是 ARMv8-A 架构,所以我们需要 aarch64-linux-gnu-gcc。一条命令搞定:
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
装完之后验证一下:
aarch64-linux-gnu-gcc --version
看到版本号就说明成功了。嗯,这里要注意——你可能会同时装多个交叉编译器,比如 arm-linux-gnueabihf 之类的。别搞混了,Atlas 200 DK 是 64 位 ARM,必须用 aarch64 前缀。
/opt/toolchains/ 下建一个目录,把交叉编译器路径加到 ~/.bashrc 里,方便切换。比如:
export PATH=$PATH:/opt/toolchains/gcc-aarch64/bin
2.2 安装 Ascend CANN 套件
CANN 是华为昇腾的 AI 计算框架,全称是 "Compute Architecture for Neural Networks"。说白了,它就是让 Atlas 200 DK 能跑 AI 模型的底层软件栈。驱动开发虽然不直接调 AI 接口,但很多硬件抽象层、内存管理、设备注册都依赖 CANN 提供的库。
下载地址在华为昇腾社区,你需要注册一个账号。我记得第一次下载时找了半天,后来发现直接搜 "Ascend CANN Toolkit" 就行。选对应版本——我推荐 5.1.RC2 或 6.0.RC1,这两个版本在驱动开发上比较稳定。
安装步骤大致如下:
- 将下载的
*.run文件传到开发机上,比如~/Downloads/。 - 赋予执行权限:
chmod +x Ascend-cann-toolkit_*.run - 运行安装:
./Ascend-cann-toolkit_*.run --install - 安装过程中会提示选择安装路径,我一般用默认的
/usr/local/Ascend。
libsqlite3-dev 或 libssl-dev,安装脚本会静默失败。所以建议先跑一遍:
sudo apt-get install libsqlite3-dev libssl-dev libffi-dev python3-dev
安装完成后,设置环境变量。CANN 提供了一个脚本,直接 source 就行:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
我个人习惯把这行加到 ~/.bashrc 里,这样每次打开终端就不用重复 source 了。
2.3 驱动开发工具链介绍
做驱动开发,光有编译器可不够。你还需要一套趁手的工具。下面这张表是我平时最常用的,你可以参考:
| 工具 | 用途 | 安装方式 |
|---|---|---|
| make / cmake | 构建系统,管理编译流程 | sudo apt install make cmake |
| Linux Kernel Headers | 编译内核模块必需的头文件 | sudo apt install linux-headers-$(uname -r) |
| devicetree-compiler (dtc) | 编译/反编译设备树 | sudo apt install device-tree-compiler |
| gdb-multiarch | 跨平台调试,支持 ARM 目标 | sudo apt install gdb-multiarch |
| perf | 性能分析,看中断延迟、CPU 占用 | sudo apt install linux-tools-common |
| ssh / adb | 连接开发板,传输文件 | 系统自带 / sudo apt install adb |
你想想看,如果没有设备树编译器,你改了 .dts 文件却没法生成 .dtb,那驱动根本加载不了。我刚开始学的时候,就因为这个卡了半天,后来才发现 dtc 没装。
2.4 验证环境是否就绪
环境搭完,怎么知道对不对?我一般写一个最简单的 "hello world" 内核模块,交叉编译后传到板子上加载。能成功 insmod,就说明环境通了。
写一个 hello.c:
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void) {
printk(KERN_INFO "Hello from Atlas 200 DK!\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye from Atlas 200 DK!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
再写一个 Makefile:
obj-m := hello.o
CROSS_COMPILE := aarch64-linux-gnu-
KERNEL_DIR := /usr/src/linux-headers-5.10.0+
all:
make -C $(KERNEL_DIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) clean
然后执行 make,会生成 hello.ko。用 scp 传到 Atlas 200 DK 上,insmod hello.ko,再用 dmesg | tail 看输出。如果看到 "Hello from Atlas 200 DK!",恭喜你,环境搭建成功。
uname -r 在板子上查一下。
好了,环境搭好,工具链就绪。接下来我们就可以真正开始写驱动了。记住,环境是基础,基础不牢,地动山摇。花点时间把这一步走稳,后面会顺畅很多。