第二章 开发环境搭建:SDK安装、交叉编译工具链配置、ADB调试与日志系统
说实话,很多做嵌入式开发的朋友,一开始就被环境搭建给劝退了。我见过太多人,拿到一块联发科的开发板,光装SDK就折腾了一周。嗯,今天咱们就把这事彻底捋清楚。
2.1 SDK安装——别急着双击安装包
联发科的SDK,说白了就是一套完整的软件开发包。里面包含了芯片的驱动库、硬件抽象层、还有各种示例代码。我个人习惯,拿到SDK后第一件事不是安装,而是先看README文件。
安装步骤其实很简单:
- 解压SDK压缩包到工作目录
- 运行
./setup.sh脚本 - 根据提示安装依赖库
这里有个坑。我曾经在项目里遇到过,setup.sh执行到一半报错,说缺少libncurses5。你想想看,一个库没装,整个环境就废了。所以我的建议是:
sudo apt-get install libncurses5 libncurses5-dev lib32z1 lib32stdc++6
2.2 交叉编译工具链配置——这是核心
交叉编译,说白了就是在你的电脑上编译出能在开发板上运行的程序。联发科平台用的是aarch64-linux-android-或arm-linux-gnueabihf-系列工具链。
配置工具链,我习惯分三步走:
- 第一步:把工具链路径加到
PATH环境变量里 - 第二步:验证工具链是否可用
- 第三步:写个测试程序跑一下
具体操作是这样的:
# 编辑 ~/.bashrc 文件
export PATH=$PATH:/opt/mediatek/toolchain/bin
# 验证
aarch64-linux-android-gcc --version
# 写个hello world
#include <stdio.h>
int main() {
printf("Hello, MTK!\n");
return 0;
}
# 编译
aarch64-linux-android-gcc -o hello hello.c
# 查看文件信息
file hello
# 输出应该是:ELF 64-bit LSB executable, ARM aarch64
为什么会强调file命令?因为我曾经吃过亏。有一次编译出来的程序,怎么都跑不起来,折腾了半天才发现——工具链配错了,编译出来的是x86的程序。你想想看,ARM开发板怎么可能跑x86的程序?
2.3 ADB调试——你的远程控制台
ADB(Android Debug Bridge)是联发科平台最常用的调试工具。它就像一根无形的线,把你的电脑和开发板连在一起。
配置ADB其实很简单:
- 安装ADB:
sudo apt-get install adb - 用USB线连接开发板
- 运行
adb devices查看设备
如果adb devices显示设备未授权,别慌。我遇到过这种情况,原因是开发板的USB调试模式没打开。解决方法:
- 在开发板上进入设置 -> 开发者选项 -> 开启USB调试
- 如果还不行,试试
adb kill-server然后adb start-server
adb shell直接进入开发板的Linux终端。这样调试起来特别方便,就像在本地操作一样。
2.4 日志系统——调试的第三只眼
联发科平台的日志系统,核心就是logcat。它会把系统里所有的日志都打印出来。但说实话,默认的logcat输出太乱了,根本没法看。
我常用的logcat命令:
# 查看所有日志
adb logcat
# 按标签过滤
adb logcat -s MTK_DEBUG
# 保存到文件
adb logcat -d > log.txt
# 清空日志缓冲区
adb logcat -c
这里有个重要的概念——日志级别。联发科平台定义了6个级别:
| 级别 | 含义 | 使用场景 |
|---|---|---|
| VERBOSE | 详细信息 | 调试时临时打印 |
| DEBUG | 调试信息 | 开发阶段使用 |
| INFO | 普通信息 | 关键流程打印 |
| WARN | 警告信息 | 潜在问题提示 |
| ERROR | 错误信息 | 异常情况记录 |
| FATAL | 致命错误 | 系统崩溃前打印 |
我曾经在项目里遇到过一个问题:系统跑着跑着就重启了,但logcat里什么错误都没有。后来才发现,是日志缓冲区太小,关键日志被覆盖了。解决方法:
adb logcat -G 256K
2.5 实战:搭建一个完整的调试环境
好了,理论说完了,咱们来点实际的。我一般搭建调试环境会按这个顺序来:
- 安装SDK和工具链
- 配置环境变量
- 连接开发板并验证ADB
- 测试日志系统
- 编译一个简单的驱动模块
最后一步特别重要。我会写一个最简单的内核模块,编译后加载到开发板上。如果这一步能成功,说明整个环境是通的。
# 一个简单的内核模块
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void) {
printk(KERN_INFO "Hello, MTK Module!\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "Goodbye, MTK Module!\n");
}
MODULE_LICENSE("GPL");
编译这个模块,用insmod加载,然后用dmesg查看内核日志。如果看到"Hello, MTK Module!",恭喜你,环境搭建成功了。
嗯,第二章就到这里。下一章咱们聊聊联发科平台的启动流程,那可是个有意思的话题。