2、开发环境搭建:Linux开发环境配置(Ubuntu 20.04)、交叉编译工具链安装、SDK获取与目录结构解析、源码编译与烧录工具使用

说实话,做嵌入式开发这么多年,我踩过最多的坑就是环境搭建。明明代码逻辑没问题,编译出来就是跑不起来。后来我学乖了——先把环境搞干净,后面能省下一大半的调试时间。

这一章,咱们就把全志XR系列芯片的开发环境从头到尾捋一遍。我用的是Ubuntu 20.04,这也是官方推荐的主机系统。你如果用的是其他版本,问题也不大,但20.04是我验证过最稳的。

2.1 主机环境准备:Ubuntu 20.04 基础配置

拿到一台新装的Ubuntu,第一件事不是装SDK,而是把基础依赖补齐。我习惯先跑一遍更新:

sudo apt update
sudo apt upgrade -y

然后安装编译必备的软件包。这里我列一个清单,你直接复制粘贴就行:

sudo apt install -y build-essential git vim cmake
sudo apt install -y python3 python3-pip
sudo apt install -y libncurses5-dev libssl-dev
sudo apt install -y flex bison
sudo apt install -y gcc-arm-none-eabi
我的小习惯: 装完这些后,我会顺手装一个tree命令。后面看SDK目录结构时,tree -L 2比ls直观太多了。

为什么要装gcc-arm-none-eabi?因为全志XR系列芯片用的是ARM Cortex-M内核,裸机或RTOS开发都需要这个交叉编译器。你想想看,如果主机是x86架构,编译出来的二进制文件当然不能在ARM上跑,对吧?

2.2 交叉编译工具链安装

官方SDK里其实自带了一套工具链,但我个人建议单独装一份。为什么?因为SDK版本更新时,工具链可能跟着变,你手头有一份独立的工具链,调试起来更灵活。

我常用的安装方式有两种:

方式一:apt直接安装(推荐新手)

sudo apt install gcc-arm-none-eabi

装完后验证一下:

arm-none-eabi-gcc --version

看到版本号输出,就说明装好了。

方式二:从ARM官网下载(推荐老手)

有时候apt源里的版本比较旧,我会去ARM官网下载最新的工具链。解压后配置环境变量:

export PATH=$PATH:/opt/gcc-arm-none-eabi-10.3-2021.10/bin

记得把这行加到~/.bashrc里,不然每次开终端都要重新export。

我曾经踩过的坑: 有次我同时装了apt版和手动版,结果两个版本冲突了。编译时一会儿用这个版本,一会儿用那个版本,出来的固件莫名其妙跑飞。后来我统一只用apt版,再也没出过问题。所以我的建议是——选一种方式,别混着来。

2.3 SDK获取与目录结构解析

全志XR系列的SDK,一般是从官方Git仓库拉下来的。我习惯用git clone,这样后续更新也方便:

git clone https://github.com/allwinner-xr/XR871-SDK.git

拉下来之后,咱们看看它的目录结构。嗯,这里我直接贴一个典型结构:

XR871-SDK/
├── app/               # 应用层代码
├── bin/               # 编译生成的二进制文件
├── build/             # 编译脚本和配置文件
├── components/        # 组件库(WiFi、蓝牙、驱动等)
├── docs/              # 文档
├── include/           # 头文件
├── lib/               # 预编译库
├── project/           # 工程配置文件
├── tools/             # 工具链和烧录工具
└── Makefile           # 顶层Makefile

这里我重点说几个目录:

  • app/:你的业务代码就放这里。我刚开始做项目时,总喜欢把代码到处乱放,结果后面找起来特别痛苦。后来我强制自己只改app/下的文件,其他目录尽量不动。
  • components/:这是SDK的核心。WiFi协议栈、蓝牙协议栈、外设驱动都在这里。你如果要做底层驱动开发,这个目录你得翻烂。
  • project/:每个工程对应一个配置文件。比如你要用XR871芯片做智能灯,就在project/下新建一个smart_light目录,里面放defconfigMakefile
避坑指南: 千万别直接修改components/下的源码!如果你需要定制驱动,正确的做法是复制一份到app/下,然后修改工程配置指向你的副本。我曾经直接改了WiFi驱动,结果SDK一更新,我的修改全被覆盖了……那叫一个酸爽。

2.4 源码编译

编译其实很简单,但有几个细节要注意。我先说标准流程:

cd XR871-SDK
make menuconfig        # 配置工程
make                   # 编译

make menuconfig会弹出一个图形化配置界面,你可以选择芯片型号、使能WiFi或蓝牙、配置调试串口等。我第一次用的时候,看到这个界面还挺亲切的——跟Linux内核的配置界面一模一样。

配置完成后,直接make就行。编译时间取决于你的机器性能,一般几分钟到十几分钟不等。

编译成功后,在bin/目录下会生成.bin文件。这就是我们要烧录到芯片里的固件。

我的调试技巧: 编译时加V=1参数,可以看到详细的编译命令:make V=1。如果编译报错,这个参数能帮你快速定位问题。我遇到链接错误时,经常靠这个参数找到是哪个.o文件出了问题。

2.5 烧录工具使用

全志XR系列芯片的烧录方式有两种:串口烧录和USB烧录。我一般用串口烧录,因为调试时串口线一直连着,方便反复烧写。

烧录工具在tools/目录下,叫phoenixMC。使用前先安装依赖:

sudo apt install libusb-1.0-0-dev

然后连接硬件:

  1. 用USB转串口线连接芯片的UART0(TX、RX、GND)。
  2. 按住芯片上的BOOT键,再按一下RESET键,然后松开BOOT键。这样芯片就进入烧录模式了。
  3. 运行烧录命令:
cd tools/phoenixMC
./phoenixMC -c /dev/ttyUSB0 -b 115200 -i ../../bin/your_firmware.bin

这里-c指定串口设备,-b指定波特率,-i指定固件路径。烧录过程中会显示进度条,看到100%就说明成功了。

注意: 串口设备名不一定是ttyUSB0,你可以用ls /dev/ttyUSB*查看。如果插上没反应,检查一下驱动:lsmod | grep ch341。很多USB转串口芯片用的是CH340或CP2102,Ubuntu默认不带驱动,需要手动装一下。

烧录完成后,按一下RESET键,芯片就会从新固件启动。如果串口助手能看到打印信息,说明一切正常。

嗯,到这里,开发环境就搭好了。你可能会觉得步骤有点多,但相信我——只要按这个流程走一遍,后面写代码、调试、烧录都会非常顺畅。下一章,咱们就开始写第一个驱动,让芯片的GPIO亮起来。