1. 课程导入
做嵌入式BSP开发,第一步不是写代码,而是把环境收拾利索。我见过太多同事,上来就啃驱动源码,结果编译都过不了,串口也打不开,折腾半天发现是工具链版本不对。这一章,咱们就把Jacinto平台的底子摸清楚。
1.1 Jacinto平台硬件架构
TDA4VM和DRA829,这两颗芯片是TI Jacinto家族的明星产品。说白了,它们就是为汽车和工业应用量身定做的异构计算平台。
我刚开始接触TDA4VM时,也被它的框图吓了一跳——CPU、DSP、深度学习加速器、图像信号处理器……一堆东西挤在一个芯片里。但拆开来看,其实就三大块:
- 主控域(Main Domain):跑Linux或QNX,负责应用调度和网络协议栈。里面是双核或四核的Cortex-A72,主频能到2.0GHz。
- MCU域(MCU Domain):跑RTOS,负责实时控制。双核Cortex-R5F,主频1.0GHz,专门处理安全相关的任务。
- 加速器域(Accelerator Domain):C7x DSP、MMA深度学习加速器、VPAC视觉预处理单元。这些是干重活的,比如目标检测、语义分割。
这三个域之间怎么通信?靠的是内部高速互联——Navigator Subsystem和Mailbox。我在项目中遇到过一个问题:A72往C7x发数据,结果DSP一直收不到。查了半天,发现是Mailbox的中断号配错了。嗯,这种跨域通信的细节,后面咱们会专门讲。
关键点:TDA4VM和DRA829的硬件引脚完全兼容。也就是说,你给TDA4VM写的BSP驱动,基本可以直接用在DRA829上。但要注意,DRA829的显示子系统更强,多了个DSS(Display Subsystem)。
下面这张图,是我自己整理的Jacinto平台核心架构关系。你看一眼,心里就有谱了。
1.2 SDK安装与配置
TI官方提供的SDK叫Processor SDK RTOS / Linux。你想想看,一个SDK里同时包含了RTOS和Linux两套软件栈,这在业界不多见。我个人习惯把SDK安装在/opt/ti/目录下,方便多版本管理。
安装步骤其实很简单:
- 从TI官网下载
ti-processor-sdk-linux-j7-evm-xx.xx.xx.xx-Linux-x86-Install.bin - 赋予执行权限:
chmod +x *.bin - 运行安装:
./ti-processor-sdk-linux-j7-evm-xx.xx.xx.xx-Linux-x86-Install.bin - 选择安装路径,比如
/opt/ti/processor-sdk-linux-j7-evm-08_06_00_12
我的习惯:安装完成后,我会在~/.bashrc里加一行export TI_SDK_PATH=/opt/ti/processor-sdk-linux-j7-evm-08_06_00_12。这样后面编译、调试时,直接引用这个环境变量,省得每次敲长路径。
SDK安装完后的目录结构,我列个表给你看:
| 目录/文件 | 说明 |
|---|---|
board-support/ |
板级支持包,包含U-Boot、Linux内核、设备树 |
linux-devkit/ |
交叉编译工具链和sysroot |
filesystem/ |
目标板根文件系统(tisdk-rootfs-image) |
example-applications/ |
TI提供的参考例程,比如GPIO、I2C、UART测试 |
docs/ |
用户手册、API文档、勘误表 |
setup.sh |
一键环境配置脚本 |
1.3 交叉编译工具链验证
交叉编译工具链,说白了就是让你在x86的PC上编译出ARM架构的可执行文件。TI SDK里自带的是gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu。
验证工具链是否正常,我一般做三步检查:
# 第一步:检查编译器版本
$ aarch64-none-linux-gnu-gcc --version
aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12) 9.2.0
# 第二步:编译一个简单的hello.c
$ aarch64-none-linux-gnu-gcc -o hello hello.c
# 第三步:查看生成文件的架构
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped
看到ARM aarch64这几个字,就说明工具链没问题。我曾经遇到一个坑:同事用错了工具链版本,编译出来的程序在目标板上跑起来就段错误。查了两天才发现是工具链的glibc版本和板子上的不匹配。所以,一定要用SDK自带的工具链,别自己去网上下一个。
避坑指南:如果你在64位Ubuntu上开发,别忘了安装32位兼容库。否则运行linux-devkit/sysroots/x86_64-arago-linux/usr/bin/下的某些工具时,会报No such file or directory。安装命令:sudo apt install lib32z1 lib32ncurses5 lib32bz2-1.0。
1.4 目标板启动与串口连接
环境搭好了,工具链也验证了,接下来就是让板子跑起来。Jacinto平台的启动流程,我画了个简图:
串口连接是调试的基础。TDA4VM EVM板上有两个UART口:
- UART0:主控域控制台,默认115200 8N1,用于Linux内核启动和shell交互。
- UART1:MCU域控制台,用于RTOS调试。
我个人习惯用screen命令连接串口:
# 安装screen(如果还没有)
$ sudo apt install screen
# 连接UART0(设备节点可能是ttyUSB0或ttyACM0)
$ screen /dev/ttyUSB0 115200
# 断开连接:Ctrl+A 然后按 K,再按 Y 确认
小技巧:如果你用minicom,记得关掉硬件流控(Hardware Flow Control)。否则板子可能不输出任何信息。我刚开始调试时就被这个坑过——串口线插上了,电源也亮了,就是没输出。折腾了半小时,发现是minicom默认开了RTS/CTS。
板子正常启动后,你会看到U-Boot的启动日志,然后Linux内核开始解压,最后弹出登录提示符。默认用户名是root,没有密码。