2、开发环境搭建:安装Intel System Studio、配置交叉编译工具链、目标板连接与调试接口(JTAG/SWD)、建立串口终端

好,咱们正式开始动手了。这一章,我带你把整个开发环境搭起来。别小看这一步,我见过太多工程师,工具链没配好就急着写代码,结果一调试就卡住,白白浪费一整天。

说白了,环境搭建就像盖楼打地基。地基不稳,后面全是坑。咱们一步步来。

2.1 安装Intel System Studio

Intel System Studio,简称ISS,是Intel官方推出的嵌入式开发套件。它集成了编译器、调试器、性能分析工具,还有各种库。我个人习惯,装完系统第一件事就是装它。

安装前的准备

  • 操作系统:Windows 10 64位或Ubuntu 18.04以上。我个人更推荐Linux,命令行操作更顺手。
  • 磁盘空间:至少留出20GB。ISS包含的交叉编译工具链和文档挺占地方的。
  • 内存:8GB以上。如果你像我一样喜欢同时开IDE、串口终端和浏览器,16GB会更从容。

安装步骤

  1. 从Intel官网下载ISS安装包。注意选择对应你目标架构的版本——x86还是ARM?别搞混了。
  2. 运行安装程序。Windows下双击exe,Linux下给.sh文件加执行权限然后运行。
  3. 选择组件时,我建议全选。虽然安装时间会长一点,但后面用到某个工具时不用再回头补装。
  4. 设置安装路径。我个人习惯放在C:\Intel\/opt/intel/下,路径里不要有中文或空格。
注意:安装过程中会提示安装驱动。如果你用的是JTAG调试器,务必勾选驱动选项。我曾经因为漏掉这一步,折腾了整整一个下午才发现是驱动没装。

2.2 配置交叉编译工具链

交叉编译,说白了就是在你的PC上编译出能在目标板上运行的程序。你想想看,目标板资源有限,不可能在上面跑编译器。所以咱们得在PC上配好交叉编译环境。

工具链路径设置

ISS安装完成后,交叉编译工具链默认在以下路径:

# Linux 下
/opt/intel/system_studio_2020/iss/bin/

# Windows 下
C:\Intel\system_studio_2020\iss\bin\

你需要把这个路径加到系统环境变量里。我个人习惯在.bashrc.zshrc里加一行:

export PATH=$PATH:/opt/intel/system_studio_2020/iss/bin/

验证工具链

配置完环境变量后,打开终端,输入:

i686-elf-gcc --version

如果看到版本信息,说明工具链配好了。如果提示“命令未找到”,嗯,检查一下路径对不对,或者重新加载一下配置文件:source ~/.bashrc

小技巧:我习惯写一个简单的测试程序来验证工具链是否工作正常。比如一个hello world,编译成目标文件,看看能不能生成正确的二进制格式。

Makefile配置示例

实际项目中,你不会每次都手动敲编译命令。写一个Makefile才是正经事。这是我常用的模板:

CC = i686-elf-gcc
CFLAGS = -Wall -O2 -ffreestanding -nostdlib
LDFLAGS = -T linker.ld

all: kernel.bin

kernel.bin: boot.o kernel.o
    $(CC) $(LDFLAGS) -o $@ $^

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

clean:
    rm -f *.o *.bin

这里要注意-ffreestanding-nostdlib这两个选项。它们告诉编译器:别依赖宿主操作系统的库,咱们是在裸机上跑。我第一次写嵌入式程序时忘了加这两个选项,结果链接时报了一堆莫名其妙的错误。

2.3 目标板连接与调试接口(JTAG/SWD)

工具链配好了,接下来得让PC和目标板“说上话”。这里有两个常用接口:JTAG和SWD。

JTAG vs SWD

特性 JTAG SWD
引脚数 5(TCK、TMS、TDI、TDO、TRST) 2(SWCLK、SWDIO)
速度 较快 稍慢,但够用
适用场景 复杂调试、多核、FPGA ARM Cortex-M系列
调试器 J-Link、OpenOCD J-Link、ST-Link

我个人习惯,如果目标板是ARM Cortex-M系列,优先用SWD。引脚少,接线简单,不容易出错。如果是x86架构或者需要调试FPGA,那就得上JTAG。

连接步骤

  1. 关闭目标板电源。这一步千万别省,我见过有人带电插拔调试器,结果烧了调试接口。
  2. 连接调试器。JTAG用20针排线,SWD用4针杜邦线。注意方向,一般调试器上会有三角标记指示1号引脚。
  3. 连接目标板。找到板子上的JTAG/SWD接口,对照原理图一一对应。
  4. 上电。先给调试器供电,再给目标板供电。
警告:接线时务必确认信号电平一致。调试器是3.3V,目标板是5V?那得加电平转换。我曾经因为没注意电平匹配,烧了一块开发板的调试接口,心疼了好几天。

验证连接

用OpenOCD检测一下:

openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

如果看到target halted的提示,恭喜你,连接成功了。

2.4 建立串口终端

调试接口搞定了,但你还得有个“耳朵”听目标板说话。串口终端就是干这个的。

串口参数设置

目标板的串口参数通常是:

  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 校验位:无
  • 流控:无

这些参数在目标板的BSP(板级支持包)文档里都能找到。如果找不到,115200 8N1是默认值,先试试。

常用终端工具

  • Windows:PuTTY、Tera Term。我个人习惯用PuTTY,轻量、稳定。
  • Linux:minicom、screen。我更喜欢screen,因为它可以后台运行,不会因为终端关闭而中断会话。

Linux下用screen连接串口

# 查看串口设备
ls /dev/ttyUSB*

# 连接串口
screen /dev/ttyUSB0 115200

断开连接:按Ctrl+A,然后按K,再按Y确认。

提示:如果连接后屏幕上什么也不显示,先检查一下串口线是不是交叉线。直连线和交叉线是两种不同的接法,搞错了就没数据。我刚开始做嵌入式时,被这个问题坑了整整两天。

测试串口通信

在目标板上运行一个简单的串口输出程序:

#include <stdio.h>

int main() {
    printf("Hello from target board!\n");
    while(1);
    return 0;
}

编译、下载、运行。如果终端上打印出了“Hello from target board!”,说明串口通信正常。

嗯,到这里,开发环境就搭好了。工具链、调试接口、串口终端,三样东西都齐了。接下来,咱们就可以真正开始写代码、调试、做性能分析了。

记住,环境搭建这一步,慢就是快。花点时间把基础打牢,后面会省去很多麻烦。