第4章:开发环境搭建与SDK部署
说实话,开发环境搭建这事儿,看着简单,但坑是真不少。我见过太多工程师,芯片还没摸热,先在环境配置上耗了两三天。这一章,我就把QNX和Android Automotive两套环境的搭建流程,还有高通SDK的安装验证,掰开了揉碎了讲清楚。
4.1 QNX开发环境配置
QNX这玩意儿,跟Linux不太一样。它是个硬实时系统,开发环境也相对封闭。我个人习惯用QNX Momentics IDE,虽然界面老点,但胜在稳定。
核心要点:QNX开发环境 = 宿主机(Ubuntu 18.04/20.04)+ 目标机(高通SA8155/SA8295)+ 网络连接
4.1.1 宿主机准备
先装好Ubuntu 20.04 LTS,别用22.04,我踩过坑——某些QNX工具链在22.04上会有奇怪的链接错误。
# 安装必要依赖
sudo apt-get update
sudo apt-get install build-essential git cmake python3 python3-pip
sudo apt-get install libncurses5-dev libssl-dev libelf-dev
4.1.2 QNX Momentics IDE安装
去QNX官网下载Momentics IDE,版本建议用7.1或8.0。安装过程其实很简单:
- 解压安装包:
tar -xzf qnxmomentics-8.0-linux.tar.gz - 运行安装脚本:
./install - 选择安装路径,我一般放
/opt/qnx - 配置环境变量
# 在 ~/.bashrc 中添加
export QNX_HOST=/opt/qnx/qnx800/host/linux/x86_64
export QNX_TARGET=/opt/qnx/qnx800/target/qnx7
export PATH=$QNX_HOST/usr/bin:$PATH
小技巧:我习惯把QNX的环境变量单独写到一个qnx_env.sh文件里,需要时source一下,避免污染全局环境。
4.1.3 目标机连接配置
目标机就是你的开发板,比如高通SA8295。通过以太网连接,配置静态IP:
# 在目标机上执行
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add default gw 192.168.1.1
然后在宿主机上测试连通性:
ping 192.168.1.100
通了?好,接下来配置QNX的qconn服务。这玩意儿是QNX的远程调试代理,必须跑起来。
# 目标机上启动qconn
qconn -p 8000
注意:我曾经遇到过qconn启动后连不上,折腾半天发现是防火墙没关。检查一下iptables,或者直接关掉防火墙省心。
4.2 Android Automotive开发环境配置
Android Automotive,说白了就是车机版的Android。开发环境跟普通Android差不多,但多了些车规级的东西。
4.2.1 AOSP源码下载
高通有自己定制的AOSP分支,别去Google官方拉,那里面没有高通BSP。你得从高通开发者网站获取:
# 以SA8295为例
repo init -u https://source.codeaurora.org/quic/la/platform/manifest -b release -m sa8295.xml
repo sync -j8
这个过程比较漫长,我建议用-j4而不是-j8,虽然慢点,但不容易出错。嗯,网络不好的话,搞个代理吧。
4.2.2 编译环境配置
Android Automotive的编译环境,跟普通AOSP一样,但要注意Java版本:
# 安装OpenJDK 11
sudo apt-get install openjdk-11-jdk
# 设置Java环境
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
然后安装编译依赖:
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev
sudo apt-get install libgl1-mesa-dev libgles2-mesa-dev
关键点:Android Automotive的编译,内存建议32GB以上,磁盘至少200GB。我见过有人用16GB内存编译,直接OOM了。
4.2.3 编译与烧录
# 初始化编译环境
source build/envsetup.sh
# 选择目标
lunch qcom_sa8295-userdebug
# 开始编译
make -j16
编译完成后,生成的文件在out/target/product/sa8295/目录下。烧录的话,高通有专门的烧录工具,叫QFIL(Qualcomm Flash Image Loader)。
4.3 高通SDK安装与验证
高通SDK,全称Qualcomm Automotive Development Platform。这东西包含了芯片的BSP、驱动、示例代码等等。
4.3.1 SDK获取
你得先签NDA,然后从高通开发者门户下载。SDK一般是个压缩包,大概5-10GB:
# 解压SDK
tar -xzf qadp_sdk_SA8295_v2.0.tar.gz -C /opt/qcom/sdk
4.3.2 SDK目录结构
解压后,目录结构大概是这样:
| 目录 | 说明 |
|---|---|
| bsp/ | 板级支持包,包含设备树、内核配置 |
| drivers/ | 驱动源码,比如显示、音频、摄像头 |
| samples/ | 示例代码,我经常从这里抄代码 |
| tools/ | 调试工具,比如性能分析器 |
| docs/ | 文档,建议先看这个 |
4.3.3 SDK验证
安装完SDK,得验证一下能不能用。我一般先编译一个示例程序:
# 进入示例目录
cd /opt/qcom/sdk/samples/hello_world
# 设置SDK环境
source /opt/qcom/sdk/envsetup.sh
# 编译
make
# 检查生成的可执行文件
file hello_world
如果输出显示ELF 64-bit LSB executable, ARM aarch64,说明SDK工作正常。
个人经验:我第一次验证SDK时,编译出来的是x86_64的可执行文件,吓我一跳。后来发现是环境变量没设对,envsetup.sh没source成功。
4.4 交叉编译工具链配置
交叉编译,说白了就是在PC上编译出能在ARM芯片上跑的程序。高通用的是GCC工具链,但版本有讲究。
4.4.1 工具链获取
高通SDK里自带工具链,在tools/目录下。你也可以从Linaro下载:
# 下载aarch64工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到/opt
sudo tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt
4.4.2 环境变量配置
# 在 ~/.bashrc 中添加
export CROSS_COMPILE=aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
4.4.3 测试交叉编译
写个简单的测试程序:
// test.c
#include <stdio.h>
int main() {
printf("Hello from SA8295!\n");
return 0;
}
然后编译:
${CC} -o test test.c
file test
输出应该是:test: ELF 64-bit LSB executable, ARM aarch64
避坑指南:我曾经用错工具链版本,编译出来的程序在目标机上跑不起来。后来发现是glibc版本不匹配。记住,工具链的glibc版本必须跟目标机上的glibc版本一致或更低。
4.5 常见问题与调试
环境搭建过程中,我遇到过不少问题。挑几个典型的说说:
- QNX连不上目标机:检查网络,检查qconn是否启动,检查防火墙
- Android编译报错:多半是Java版本不对,或者内存不够
- SDK验证失败:环境变量没设对,或者SDK版本跟目标芯片不匹配
- 交叉编译链接错误:库路径不对,或者工具链版本不匹配
嗯,环境搭建这块,说白了就是耐心活。别急,一步一步来,肯定能搞定。下一章我们开始讲高通芯片的启动流程,那才是真正有意思的东西。