1. 课程导入

做嵌入式BSP开发,第一件事不是写代码,而是先把环境搭明白。我见过太多人上来就啃datasheet,结果编译都过不了,白白浪费几天时间。今天咱们就从TI Jacinto平台说起,把整个开发环境捋一遍。

1.1 TI Jacinto平台是什么?

TI Jacinto系列,说白了就是德州仪器针对汽车电子和工业视觉推出的高性能SoC家族。它跟普通的MCU不一样,内部集成了ARM Cortex-A系列应用处理器、Cortex-R系列实时处理器、还有DSP和硬件加速器。

我个人习惯把Jacinto分成三代:

世代 代表型号 核心架构 典型应用
第一代 Jacinto 5 / DRA74x 双核A15 + 双核M4 + DSP 车载信息娱乐、仪表盘
第二代 Jacinto 6 / DRA75x 双核A15 + 双核A15 + 双核M4 + EVE ADAS、环视、融合感知
第三代 Jacinto 7 / TDA4VM 双核A72 + 双核R5F + C7x DSP + MMA 自动驾驶域控、中央计算

嗯,这里要注意:Jacinto 7这一代变化很大。它把实时核从M4换成了R5F,还加入了专用的矩阵乘法加速器(MMA)。我在做TDA4VM的BSP移植时,光理解这些异构核之间的通信机制就花了两周。

1.2 BSP在嵌入式系统中的角色

BSP(板级支持包)是什么?它介于硬件和操作系统之间。你想想看,没有BSP,Linux内核怎么知道你的板子上有几个UART?GPIO映射到哪个物理地址?

BSP的核心职责就三件事:

  • 硬件抽象:把寄存器操作封装成标准接口
  • 系统初始化:时钟、DDR、外设的早期配置
  • 设备驱动:让操作系统能控制具体硬件

我曾经在一个项目里踩过坑——客户拿到的开发板BSP是TI官方SDK,但他们的自研板改了DDR颗粒型号。结果系统启动到一半就挂了,连串口都没打印。查了两天才发现是DDR时序参数没改。这就是BSP里最基础也最容易忽略的部分。

一句话总结:BSP就是硬件和软件之间的翻译官。翻译错了,整个系统都跑不起来。

1.3 开发环境搭建

好,咱们开始动手。环境搭建分三步走:SDK安装、交叉编译链配置、验证。

1.3.1 SDK安装

TI的Jacinto SDK叫PROCESSOR-SDK-LINUX-JACINTO。我建议你直接从TI官网下载最新LTS版本。目前稳定的是08_06_00_xx系列。

安装步骤很简单:

# 1. 下载SDK安装包
wget https://www.ti.com/.../ti-processor-sdk-linux-jacinto7-evm-08_06_00_xx-Linux-x86-Install.bin

# 2. 赋予执行权限
chmod +x ti-processor-sdk-linux-jacinto7-evm-08_06_00_xx-Linux-x86-Install.bin

# 3. 运行安装(建议安装在 /opt 下)
./ti-processor-sdk-linux-jacinto7-evm-08_06_00_xx-Linux-x86-Install.bin

# 4. 安装完成后,目录结构如下
/opt/ti-processor-sdk-linux-jacinto7-evm-08_06_00_xx/
├── board-support/
├── example-applications/
├── filesystem/
├── linux-devkit/
├── Makefile
├── Rules.make
└── setup.sh

安装完SDK后,我建议你先跑一下setup.sh。它会帮你检查系统依赖,缺什么包会提示你安装。别跳过这步,我见过有人直接编译,结果卡在缺少libncurses-dev上,折腾半天。

1.3.2 交叉编译链配置

交叉编译链,说白了就是在一台x86电脑上编译出能在ARM上跑的程序。TI SDK里已经自带了编译链,在linux-devkit/sysroots/目录下。

我个人习惯把编译链路径加到~/.bashrc里:

# 在 ~/.bashrc 末尾添加
export TI_SDK_PATH=/opt/ti-processor-sdk-linux-jacinto7-evm-08_06_00_xx
export PATH=$TI_SDK_PATH/linux-devkit/sysroots/x86_64-arago-linux/usr/bin:$PATH
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 然后生效
source ~/.bashrc

验证编译链是否可用:

$ aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2.1) 9.2.1 20191025
Copyright (C) 2019 Free Software Foundation, Inc.

看到版本号就说明配置成功了。

小技巧:如果你同时做多个项目,建议用source脚本的方式管理环境变量,而不是写死在.bashrc里。我每个项目都放一个envsetup.sh,用的时候source一下,互不干扰。

1.3.3 验证环境:编译一个Hello World

环境搭好了,咱们写个最简单的程序验证一下:

// hello_bsp.c
#include <stdio.h>

int main(void)
{
    printf("Hello from TI Jacinto BSP!\n");
    return 0;
}

编译:

$ aarch64-linux-gnu-gcc -o hello_bsp hello_bsp.c
$ file hello_bsp
hello_bsp: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1

看到ARM aarch64就对了。把这个文件拷贝到开发板上,运行一下:

# ./hello_bsp
Hello from TI Jacinto BSP!

嗯,到这里,你的BSP开发环境就算搭好了。

避坑指南:我曾经在Ubuntu 22.04上装SDK 08_05_00_xx,结果编译内核时报gcc version mismatch。后来发现TI官方SDK对宿主机的gcc版本有要求。建议用Ubuntu 20.04或18.04做开发机,兼容性最好。

1.4 知识体系全景图

下面这张图把本章的核心内容串起来了。你可以把它当作后续学习的路线图:

BSP开发环境全景图 TI Jacinto 平台 硬件抽象层 系统初始化 设备驱动 SDK安装 交叉编译链配置 环境验证 可启动的BSP镜像(u-boot + kernel + rootfs) 核心要点 ① 理解Jacinto平台异构架构 ② 掌握BSP三层职责 ③ 熟练搭建SDK+交叉编译链 ④ 能用Hello World验证环境

这张图把本章的知识点串成了从平台到产物的完整链路。后续每一章都会围绕其中一个节点展开。你先把环境搭好,后面写驱动、调内核才有基础。