3、MTK SDK与开发环境搭建:安装MediaTek SDK、配置交叉编译工具链、搭建Eclipse/VS Code开发环境

好,咱们直接进入正题。这一章,我带你亲手把开发环境搭起来。

说实话,我见过太多新手卡在这一步。SDK版本不对、工具链路径配错、IDE死活连不上调试器……我自己当年也踩过不少坑。所以这一章,我会把每个细节都掰开揉碎了讲。

3.1 安装MediaTek SDK

先说说SDK。MediaTek的SDK,说白了就是一套完整的软件开发包。里面包含了芯片的驱动库、硬件抽象层(HAL)、协议栈、示例代码,还有一堆工具脚本。

第一步:获取SDK

我个人习惯从MediaTek的官方开发者门户下载。你需要注册一个账号,然后申请权限。注意,不同芯片系列的SDK是分开的。比如MT762x系列和MT85xx系列,SDK结构差异很大。

我曾经遇到过有人拿MT7621的SDK去编译MT8516的项目,结果折腾了两天,全是链接错误。嗯,这里要特别注意。

第二步:解压与目录结构

下载下来通常是一个.tar.gz或.zip文件。我建议放在/home/你的用户名/mediatek/下,不要放在有中文或空格的路径里,否则后面交叉编译工具链会报一些莫名其妙的错。

tar -xzvf MTK_SDK_XXXX.tar.gz -C ~/mediatek/
cd ~/mediatek/MTK_SDK_XXXX/
ls -l

解压后,你会看到类似这样的目录结构:

目录名 说明
kernel/ Linux内核源码及补丁
bootloader/ 引导加载程序(如U-Boot)
driver/ 外设驱动源码(I2C、SPI、UART等)
hal/ 硬件抽象层接口
middleware/ 中间件(如音频处理、网络协议栈)
example/ 官方示例工程,强烈建议先跑一遍
toolchain/ 交叉编译工具链(有些SDK会自带)

第三步:安装依赖库

SDK里的编译脚本依赖一些系统库。你想想看,如果缺了libncurses,配置内核时菜单都出不来。我建议先跑一遍这个:

sudo apt-get update
sudo apt-get install -y build-essential git libncurses-dev \
  flex bison libssl-dev libelf-dev u-boot-tools
我的小技巧: 每次拿到新SDK,我第一件事就是看docs/目录下的Getting_Started.pdf。里面通常会列出所有依赖。别偷懒,这一步能省你后面很多时间。

3.2 配置交叉编译工具链

交叉编译,说白了就是在你的PC(x86架构)上编译出能在ARM或MIPS架构的MTK芯片上运行的程序。工具链就是干这个的。

3.2.1 获取工具链

MediaTek官方SDK里通常会自带工具链,就在toolchain/目录下。如果没有,你可以从Linaro或ARM官网下载。

我个人习惯用gcc-arm-10.3版本,稳定且对多核支持好。举个例子,MT7621是MIPS架构,MT8516是ARM Cortex-A系列,工具链完全不同。

# 以ARM 64位工具链为例
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C ~/toolchains/

3.2.2 设置环境变量

这一步很关键。你想想看,如果不告诉系统工具链在哪,make命令怎么知道用哪个编译器?

export PATH=$PATH:~/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64

我建议把这些写到~/.bashrc里,这样每次打开终端就不用重新设了。

echo 'export PATH=$PATH:~/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
echo 'export CROSS_COMPILE=aarch64-none-linux-gnu-' >> ~/.bashrc
echo 'export ARCH=arm64' >> ~/.bashrc
source ~/.bashrc
避坑指南: 我曾经因为同时装了多个版本的工具链,导致编译时链接了错误的libstdc++,程序跑起来就段错误。后来我学乖了,每个项目单独用一个终端,只设置当前项目需要的环境变量。

3.2.3 验证工具链

配置完一定要验证一下。跑个简单的测试程序,确保能编译通过。

aarch64-none-linux-gnu-gcc --version
# 应该输出类似:gcc (GNU Toolchain for the A-profile Architecture) 10.3-2021.07

# 写一个简单的hello.c
echo '#include <stdio.h>
int main() { printf("Hello MTK Multi-Core!\n"); return 0; }' > hello.c

aarch64-none-linux-gnu-gcc -o hello hello.c
file hello
# 输出应该包含:ELF 64-bit LSB executable, ARM aarch64

3.3 搭建Eclipse/VS Code开发环境

好,工具链配好了,接下来就是IDE。我个人更推荐VS Code,轻量、插件丰富。但如果你习惯Eclipse,也没问题,MTK官方对Eclipse的支持其实更成熟。

3.3.1 VS Code配置

第一步:安装必要插件

  • C/C++(Microsoft官方)—— 代码补全、跳转、调试
  • Cortex-Debug —— 如果你用ARM芯片,这个插件能直接连JTAG/SWD调试器
  • Remote - SSH —— 我习惯在远程服务器上编译,本地用VS Code编辑
  • GitLens —— 查看代码历史,方便回溯

第二步:配置编译任务

在项目根目录下创建.vscode/tasks.json,把编译命令写进去。这样按Ctrl+Shift+B就能一键编译。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build MTK Project",
            "type": "shell",
            "command": "make",
            "args": ["-j4"],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"]
        }
    ]
}

第三步:配置调试器

调试多核程序时,我习惯用launch.json配置GDB。注意要指定交叉编译版本的GDB,不能用PC自带的。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Debug MTK Multi-Core",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/output.elf",
            "args": [],
            "stopAtEntry": true,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "aarch64-none-linux-gnu-gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty printing",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
我的经验: 调试多核程序时,记得在launch.json里设置"stopAtEntry": true。这样程序一启动就停在main函数入口,你可以手动切换到不同核心的线程去设断点。否则程序跑起来,你根本来不及抓。

3.3.2 Eclipse配置

如果你用Eclipse,步骤稍微多一点,但功能更全。

  1. 安装CDT插件 —— Eclipse的C/C++开发工具包
  2. 创建交叉编译工程 —— 新建C Project,选择"Cross GCC"
  3. 配置工具链路径 —— 在Project Properties -> C/C++ Build -> Settings -> Cross Settings 里,填入交叉编译器的前缀和路径
  4. 配置调试器 —— 使用GDB Hardware Debugging,选择对应的GDB可执行文件

说实话,Eclipse的配置界面有点繁琐。我建议新手先用VS Code,等熟悉了再转Eclipse。不过Eclipse有一个好处:它对多核调试的线程视图支持得更好,能直观看到每个核心的运行状态。

3.4 验证环境:编译第一个多核示例

环境搭好了,咱们跑个官方示例验证一下。SDK的example/目录下通常有一个hello_multicore的工程。

cd ~/mediatek/MTK_SDK_XXXX/example/hello_multicore
make clean
make -j4

如果一切顺利,你会看到类似这样的输出:

  CC      main.o
  CC      core0_task.o
  CC      core1_task.o
  CC      ipc.o
  LD      hello_multicore.elf
  OBJCOPY hello_multicore.bin

看到hello_multicore.bin生成,说明你的环境已经搭好了。这个bin文件就是最终要烧录到MTK芯片上的固件。

核心要点:
  • SDK版本必须与芯片型号严格匹配
  • 交叉编译工具链的路径和环境变量必须正确设置
  • IDE的调试配置要指定交叉编译版本的GDB
  • 每次编译前,先make clean,避免缓存干扰

嗯,到这里,你的开发环境就彻底搭好了。下一章,咱们开始真正写代码——创建第一个多核任务,让两个核心同时跑起来。到时候你会发现,前面这些环境配置的辛苦,都是值得的。