HPM6750 RISC-V开发:Ubuntu环境搭建与CMake构建实战
1. 项目概述:为什么选择Ubuntu作为HPM6750的开发平台?
拿到一块像HPM6750这样的高性能RISC-V微控制器,第一件事就是搭环境。很多工程师可能会习惯性地在Windows下用Keil、IAR这类IDE,但对于HPM6750,官方主推的其实是基于Ubuntu的命令行开发环境。这可能会让一些朋友感到头大,命令行?编译链?听起来就麻烦。但别急,我以过来人的经验告诉你,一旦你跨过这个门槛,你会发现这套工具链的效率、灵活性和对复杂项目的管理能力,是传统IDE难以比拟的。
HPM6750是杭州先楫半导体推出的一款双核RISC-V MCU,主频高达816MHz,性能直逼应用处理器。要驾驭这样的“性能怪兽”,开发环境也必须足够强大和稳定。Ubuntu作为一个成熟的Linux发行版,提供了极其稳定和丰富的底层支持,无论是GCC工具链的版本管理、Python脚本的依赖,还是各种调试工具(如OpenOCD)的集成,都远比在Windows上通过模拟环境(如WSL)或交叉安装来得直接和可靠。官方提供的SDK和构建系统(基于CMake)也是深度为Linux环境优化过的。因此,搭建一个纯净、高效的Ubuntu开发环境,是深入玩转HPM6750系列芯片的必经之路,也是后续进行驱动开发、系统移植和性能优化的基石。
2. 环境搭建全流程解析与实操要点
搭建环境听起来简单,无非是装系统、装软件,但其中有很多细节直接决定了你后续开发的顺畅度。是使用实体机、虚拟机还是WSL?Ubuntu版本如何选择?网络环境如何配置?每一步都有讲究。
2.1 开发主机环境选型:实体机、虚拟机与WSL的深度对比
首先,我们需要决定在哪里运行Ubuntu。主要有三种方案:实体机安装、虚拟机(如VMware/VirtualBox)和Windows Subsystem for Linux (WSL2)。
实体机安装:这是最纯粹、性能最好的方案。你的电脑将完全运行Ubuntu系统,所有硬件资源(尤其是USB接口)都能被原生调用,这对于连接调试器(如DAP-Link)至关重要,兼容性最好,几乎没有坑。缺点是对于需要频繁切换回Windows处理其他事务(如办公、沟通)的用户不够友好。如果你有一台备用电脑,或者你主力开发就在Linux下,这是首选。
虚拟机方案:在Windows或macOS上通过VMware Workstation或VirtualBox安装Ubuntu。这种方式兼顾了宿主系统的便利性和Linux环境。它的优势是灵活,可以随时挂起、快照,方便环境备份和恢复。但缺点也很明显:性能有损耗(特别是I/O和图形),USB设备穿透(Passthrough)有时会不稳定,可能导致调试器无法识别或连接中断。对于新手或者需要跨平台工作的开发者,虚拟机是一个不错的起点,但务必确保你的宿主机有足够的内存(建议16GB以上)并为虚拟机分配至少4核CPU和40GB磁盘空间。
WSL2方案:这是Windows 10/11提供的一个“官方虚拟机”。它比传统虚拟机更轻量,与Windows文件系统的互操作性极佳。然而,WSL2的主要问题在于对USB设备的支持。虽然可以通过usbipd-win等工具实现USB重定向,但步骤繁琐,且稳定性存疑,对于依赖特定USB调试器的嵌入式开发来说,这常常成为致命伤。因此,对于HPM6750开发,我个人不推荐WSL2作为主力环境,除非你仅进行代码编译和模拟,不涉及实际硬件调试。
注意:无论选择哪种方案,请确保你的网络环境稳定,能够顺畅访问GitHub、APT软件源等境外资源。这是后续顺利安装依赖的关键,很多“卡住”的问题都源于此。
2.2 Ubuntu系统安装与基础配置指南
这里我们以虚拟机安装Ubuntu 22.04 LTS为例进行详细说明,因为这个方案受众最广。为什么选22.04 LTS?因为它是长期支持版本,社区支持好,软件包稳定,与HPM6750 SDK的兼容性经过充分测试。20.04也可以,但一些较新的工具可能需要手动升级。
- 下载系统镜像:前往Ubuntu官网下载Ubuntu 22.04.3 LTS的ISO镜像文件。
- 创建虚拟机:以VMware Workstation 17为例。新建虚拟机,选择“自定义”,硬件兼容性选最新版本。操作系统选择Linux,版本Ubuntu 64位。处理器数量建议2核以上,内存至少4GB(8GB更佳)。网络连接选择“桥接模式”,这样虚拟机将获得一个独立的局域网IP,方便后续开发。磁盘大小建议40GB以上,选择“将虚拟磁盘拆分成多个文件”。
- 安装Ubuntu:启动虚拟机并加载ISO镜像。语言选中文或英文。安装类型选择“正常安装”,为了节省空间可以不选“安装Ubuntu时下载更新”。磁盘分区新手就选“清除整个磁盘并安装Ubuntu”。设置你的用户名、计算机名和密码。等待安装完成并重启。
- 安装VMware Tools(增强工具):这是关键一步,它能显著提升虚拟机的显示性能、实现宿主机与虚拟机之间的文件拖拽和剪贴板共享。在VMware菜单中点击“虚拟机” -> “安装VMware Tools”,然后在Ubuntu桌面会自动挂载一个光盘,将里面的
VMwareTools-xxx.tar.gz压缩包复制到桌面(或/tmp),打开终端,执行以下命令:
安装过程中,对所有提示都按回车选择默认选项即可。安装完成后重启虚拟机。cd ~/Desktop # 或 cd /tmp tar -xzvf VMwareTools-*.tar.gz cd vmware-tools-distrib/ sudo ./vmware-install.pl - 基础系统配置:
- 更换软件源:为了获得更快的下载速度,将APT源更换为国内镜像(如阿里云、清华源)。打开“软件和更新”,在“下载自”下拉框中选择
mirrors.aliyun.com。 - 更新系统:打开终端,执行
sudo apt update && sudo apt upgrade -y,更新所有软件包。 - 安装必要工具:
sudo apt install -y build-essential git wget curl cmake ninja-build。build-essential包含了GCC、Make等基础编译工具,是后续一切的基础。
- 更换软件源:为了获得更快的下载速度,将APT源更换为国内镜像(如阿里云、清华源)。打开“软件和更新”,在“下载自”下拉框中选择
2.3 核心开发工具链安装与验证
HPM6750的开发需要RISC-V架构的交叉编译工具链。先楫官方推荐并使用的是xpack-riscv-none-elf-gcc,这是一个维护良好的预编译工具链。
下载工具链:我们直接从GitHub Release页面下载。在终端中执行:
# 创建一个用于存放开发工具的目录 mkdir -p ~/hpm_sdk/tools cd ~/hpm_sdk/tools # 下载工具链 (版本号请以官网最新为准,此处以12.2.0-1为例) wget https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v12.2.0-1/xpack-riscv-none-elf-gcc-12.2.0-1-linux-x64.tar.gz # 解压 tar -xzvf xpack-riscv-none-elf-gcc-12.2.0-1-linux-x64.tar.gz # 解压后会得到一个类似 xpack-riscv-none-elf-gcc-12.2.0-1 的目录配置环境变量:为了让系统在任何位置都能找到这个工具链,我们需要将其路径添加到
PATH环境变量中。编辑用户主目录下的.bashrc文件(如果使用Zsh则是.zshrc)。nano ~/.bashrc在文件末尾添加以下内容(请根据你实际解压的路径修改):
# HPM6750 RISC-V Toolchain export PATH=$PATH:$HOME/hpm_sdk/tools/xpack-riscv-none-elf-gcc-12.2.0-1/bin保存退出(
Ctrl+X,然后按Y,再回车)。然后让配置立即生效:source ~/.bashrc。验证工具链:输入以下命令,如果显示版本信息,则说明安装成功。
riscv-none-elf-gcc --version你应该能看到类似
riscv-none-elf-gcc (xPack GNU RISC-V Embedded GCC x86_64) 12.2.0的输出。
2.4 获取官方SDK与构建系统初始化
工具链就绪后,我们需要获取先楫官方提供的软件开发套件(SDK),其中包含了芯片外设驱动、板级支持包、丰富的示例工程以及最重要的——CMake构建系统。
克隆SDK仓库:官方SDK托管在GitHub上。我们使用
git来获取,并推荐使用--depth=1参数只克隆最新提交,以节省时间和空间。cd ~ git clone --depth=1 https://github.com/hpmicro/hpm-sdk.git如果网络不畅,可以考虑使用Gitee镜像:
https://gitee.com/hpmicro/hpm-sdk.git。初始化SDK与子模块:SDK依赖一些子模块(如特定芯片的组件包)。进入SDK目录并初始化。
cd hpm-sdk # 同步子模块(同样可以加--depth=1) git submodule update --init --recursive --depth=1这个过程可能会花费一些时间,取决于你的网络。
安装Python依赖:HPM SDK的构建脚本和部分工具是用Python编写的。确保你的Python版本在3.8以上(Ubuntu 22.04默认符合)。然后安装必要的Python包。
# 安装pip(如果尚未安装) sudo apt install -y python3-pip # 安装依赖包,建议使用用户目录安装避免系统污染 pip3 install --user -r scripts/requirements.txt这里
--user参数将包安装到当前用户目录下,不需要sudo权限,更安全。
3. 从零构建第一个示例工程
环境搭建好了,工具链和SDK也齐了,是时候点亮第一个LED了!我们将通过构建并运行一个最简单的hello_world(或者led_blinky)示例,来验证整个开发环境是否工作正常。
3.1 示例工程选择与目录结构解读
进入SDK的示例目录,你会发现按芯片型号和开发板分类了大量的例子。
cd ~/hpm-sdk/samples ls你可能会看到hpm6750evk2,hpm6750evkmini等目录,对应不同的官方评估板。我们以hpm6750evkmini为例,它是一款小巧且常用的开发板。
cd hpm6750evkmini ls这里会有hello_world,led_blinky,uart_echo等基础示例。我们选择led_blinky。先看看它的目录结构:
led_blinky/ ├── CMakeLists.txt # CMake构建定义文件 ├── src/ │ └── main.c # 主程序源代码 └── README.md # 说明文档这个结构非常清晰。CMakeLists.txt告诉构建系统如何编译这个工程,src/main.c就是我们要编写和查看的代码。
3.2 CMake构建流程详解与编译实战
HPM SDK使用CMake作为跨平台的构建系统生成器,再配合Ninja这个高速构建工具。我们不在示例源码目录内直接构建,而是采用“外部构建”的方式,这是CMake推荐的最佳实践,可以保持源码目录的清洁。
创建构建目录并配置:在SDK的根目录下,为我们的构建创建一个独立的目录。
cd ~/hpm-sdk # 创建一个用于构建evkmini板led_blinky工程的目录 mkdir -p build/evkmini_led_blinky cd build/evkmini_led_blinky运行CMake配置:这一步会检测系统环境、工具链,并生成Ninja构建文件。
cmake -G Ninja -DBOARD=hpm6750evkmini -DAPP=led_blinky ../..-G Ninja: 指定生成Ninja格式的构建文件。-DBOARD=hpm6750evkmini: 定义目标开发板型号,这个变量会被SDK的CMake脚本读取,以链接正确的板级支持包和链接脚本。-DAPP=led_blinky: 定义要构建的应用程序目录名。../..: 指向顶级CMakeLists.txt所在的路径(即SDK根目录)。
执行成功后,你会看到大量输出信息,最后几行会总结出配置结果,包括使用的工具链、目标芯片、编译选项等。
执行编译:配置完成后,使用Ninja进行编译。
ninja如果一切顺利,编译过程会快速完成,并在当前目录下生成最终的可执行文件(通常是
elf格式)和二进制文件(bin或hex)。你会在输出信息的最后看到生成的文件路径,例如led_blinky.elf。
3.3 生成固件与链接脚本分析
编译成功后,我们不仅得到了elf文件,构建系统还会自动调用工具链中的objcopy等工具,生成可以直接烧录到Flash中的二进制文件(bin)或Intel Hex文件(hex)。
查看生成文件:
ls -la *.elf *.bin *.hex通常你会看到
led_blinky.elf(调试用)、led_blinky.bin(烧录用)和led_blinky.hex(烧录用)。理解链接脚本:嵌入式程序之所以能正确运行,链接脚本(Linker Script)至关重要。它定义了内存布局:代码(
.text)放在哪里,数据(.data,.bss)放在哪里,堆栈(stack)从哪里开始。HPM SDK的链接脚本位于boards/{BOARD_NAME}/linker_script/目录下。例如,对于hpm6750evkmini,你可以查看:cat ~/hpm-sdk/boards/hpm6750evkmini/linker_script/gcc.ld你会看到
MEMORY区域定义了ITCM、DTCM、SRAM、Flash等各段内存的起始地址和大小。SECTIONS部分则规定了各个输入段(如.text*,.data*)具体输出到哪个内存区域。理解这个文件,对于后续进行内存优化、将代码或数据分配到特定RAM中提升性能,有极大帮助。
4. 调试环境搭建与程序烧录
代码编译成功只是第一步,让它在真实的芯片上跑起来才是目的。这需要调试器和配套软件。
4.1 调试器硬件连接与驱动准备
HPM6750 EVK系列开发板通常板载了DAP-Link或J-Link OB调试器。我们以最常见的DAP-Link为例。
- 硬件连接:使用USB线连接开发板的“DEBUG USB”口到电脑。如果是虚拟机,此时需要在VMware窗口右下角点击USB图标,将识别到的
CMSIS-DAP或DAPLink设备连接到虚拟机。 - 检查设备识别:在Ubuntu终端中输入
lsusb,你应该能看到一个类似NXP Semiconductors: CMSIS-DAP的设备。 - 安装OpenOCD:OpenOCD是一个开源的片上调试器,用于连接调试器和目标芯片。HPM SDK提供了定制化的OpenOCD版本。我们通常不需要单独安装,因为SDK的
scripts目录下已经包含了预编译好的openocd可执行文件,并且配置好了HPM6750的芯片支持包。确保其有执行权限:chmod +x ~/hpm-sdk/tools/openocd/openocd
4.2 使用OpenOCD进行程序烧录与调试
我们可以使用命令行直接烧录,也可以配置VS Code进行图形化调试。先看命令行方式。
命令行烧录:在SDK根目录下,有一个非常方便的Python脚本
flash_program.py。cd ~/hpm-sdk # 烧录之前编译好的bin文件到开发板 python3 scripts/flash_program.py -t board -b hpm6750evkmini -f build/evkmini_led_blinky/led_blinky.bin-t board: 指定目标类型为开发板。-b hpm6750evkmini: 指定板型。-f: 指定要烧录的二进制文件路径。 脚本会自动调用正确的OpenOCD配置,连接芯片、擦除、编程、校验。看到“Programming Finished”和“Verify Success”即表示烧录成功。此时按下开发板的复位键,你应该能看到LED开始闪烁。
命令行调试:如果你想进行单步调试,可以使用GDB配合OpenOCD。
- 终端1:启动OpenOCD作为GDB服务器。
如果成功,它会输出信息并停在cd ~/hpm-sdk ./tools/openocd/openocd -f boards/hpm6750evkmini/openocd.cfg“Listening on port 3333 for gdb connections”。 - 终端2:启动GDB并连接。
在GDB命令行中:cd ~/hpm-sdk/build/evkmini_led_blinky riscv-none-elf-gdb led_blinky.elf
这样就可以进行单步、查看变量等调试操作了。(gdb) target remote localhost:3333 (gdb) load # 加载程序 (gdb) monitor reset halt # 复位并暂停CPU (gdb) b main # 在main函数设断点 (gdb) continue # 运行到断点
- 终端1:启动OpenOCD作为GDB服务器。
4.3 VS Code集成开发环境配置
对于复杂项目,图形化IDE能极大提升效率。VS Code通过插件可以完美支持嵌入式开发。
安装VS Code及插件:在Ubuntu Software中安装VS Code。然后安装以下核心插件:
- C/C++(Microsoft):提供代码智能感知、跳转。
- CMake Tools(Microsoft):集成CMake配置、构建、调试。
- Cortex-Debug:提供ARM Cortex-M(及RISC-V)的图形化调试支持(需要配合OpenOCD或J-Link)。
配置CMake Tools:打开VS Code,打开
~/hpm-sdk文件夹。按Ctrl+Shift+P,输入CMake: Configure,它会自动扫描并让你选择一个“Kit”(工具链)。选择GCC for riscv-none-elf。然后在底部状态栏,你可以选择BOARD(如hpm6750evkmini)和APP(如led_blinky),然后点击“Build”按钮即可编译,非常方便。配置调试:创建
.vscode/launch.json文件。{ "version": "0.2.0", "configurations": [ { "name": "OpenOCD Debug (HPM6750)", "type": "cortex-debug", "request": "launch", "servertype": "openocd", "cwd": "${workspaceRoot}", "executable": "${workspaceRoot}/build/evkmini_led_blinky/led_blinky.elf", "serverpath": "${workspaceRoot}/tools/openocd/openocd", "serverargs": [ "-f", "boards/hpm6750evkmini/openocd.cfg" ], "device": "HPM6750", "svdFile": "${workspaceRoot}/boards/hpm6750evkmini/hpm6750.svd", "runToEntryPoint": "main", "showDevDebugOutput": true } ] }这个配置告诉Cortex-Debug插件使用我们SDK里的OpenOCD,加载指定的elf文件,并使用SVD文件来解析外设寄存器。配置好后,按F5就可以一键启动调试,享受图形化的断点、变量查看、寄存器查看等功能。
5. 常见问题排查与性能优化心得
环境搭建和第一次烧录很少有一帆风顺的,这里总结几个我踩过的坑和对应的解决办法。
5.1 编译与链接阶段典型错误
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
riscv-none-elf-gcc: command not found | 环境变量未正确配置或未生效。 | 1. 检查~/.bashrc中的PATH路径是否正确。2. 执行 source ~/.bashrc或重新打开终端。3. 用 echo $PATH查看路径是否包含工具链bin目录。 |
CMake Error: The source directory ... does not appear to contain CMakeLists.txt | cmake命令执行的路径不对,或者-DAPP指定的目录名错误。 | 确保在build目录下执行cmake,且-DAPP的值必须是samples/下存在的子目录名。仔细检查拼写。 |
fatal error: board.h: No such file or directory | SDK子模块未初始化完整,或BOARD变量设置错误。 | 1. 确保在SDK根目录执行了git submodule update --init --recursive。2. 检查 -DBOARD=的参数是否与boards/目录下的文件夹名完全一致。 |
undefined reference toxxx‘` | 链接错误,通常是缺少某个库文件或源文件。 | 1. 检查对应的驱动或组件是否被正确包含在CMakeLists.txt中。2. 尝试先执行 ninja clean,然后重新cmake和ninja,避免旧缓存干扰。 |
| 编译时间过长或卡住 | 可能是网络问题导致git submodule更新失败,或是虚拟机资源不足。 | 1. 检查git submodule过程是否有错误。2. 为虚拟机分配更多CPU核心和内存。 3. 使用 ninja -j4指定并行编译任务数(数字可改为你的CPU核心数)。 |
5.2 调试与烧录连接故障
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
OpenOCD报错Error: open failed | 调试器USB权限不足或未被虚拟机识别。 | 1.虚拟机用户:确保在VMware中已将USB调试器设备连接到虚拟机。 2.Linux权限:创建udev规则,将调试器设备权限赋予用户组。将以下内容保存为 /etc/udev/rules.d/99-openocd.rules:SUBSYSTEM=="usb", ATTR{idVendor}=="0d28", MODE="0666"(0d28是DAP-Link的常见VID)然后重启udev服务: sudo udevadm control --reload-rules && sudo udevadm trigger。 |
| OpenOCD无法识别芯片ID | 开发板未供电或复位电路异常,OpenOCD配置文件中芯片型号不匹配。 | 1. 确认开发板已通过供电USB口或外部电源上电。 2. 检查 openocd.cfg文件中adapter speed是否设置过高(如10000),可尝试降低为500或1000。3. 确认使用的 cfg文件与你的开发板型号匹配。 |
GDB连接超时 (Connection timed out) | OpenOCD的GDB服务器未成功启动,或端口被占用。 | 1. 先确保OpenOCD进程已正常启动并监听3333端口(看其输出日志)。 2. 使用`netstat -tlnp |
| 烧录成功但程序不运行 | 程序入口地址或复位向量设置错误;链接脚本中Flash地址与烧录地址不匹配。 | 1. 检查链接脚本中FLASH区域的起始地址是否与芯片手册一致。2. 使用 riscv-none-elf-objdump -h led_blinky.elf查看.text段是否确实在Flash地址区间。3. 确认烧录命令烧写的是 bin文件,且地址正确(通常从0x0开始)。 |
5.3 环境优化与使用技巧
为终端配置别名(Alias):频繁输入长路径很麻烦。在
~/.bashrc中添加别名可以极大提升效率。alias cdhpm='cd ~/hpm-sdk' alias build-led='cd ~/hpm-sdk/build/evkmini_led_blinky && ninja' alias flash-led='cd ~/hpm-sdk && python3 scripts/flash_program.py -t board -b hpm6750evkmini -f build/evkmini_led_blinky/led_blinky.bin'保存后
source ~/.bashrc,之后只需输入build-led即可编译,flash-led即可烧录。使用ccache加速编译:对于大型项目,重复编译时ccache可以缓存中间结果,极大提升增量编译速度。
sudo apt install ccache在CMake配置时,添加
-DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache参数即可启用。保持SDK更新:先楫SDK仍在活跃开发中,定期更新可以获取新特性和Bug修复。
cd ~/hpm-sdk git pull origin master git submodule update --init --recursive注意:更新后,旧的
build目录可能需要清空重建,因为CMake缓存可能不兼容。善用
hpm_sdk_config.h:这个文件(位于boards/{BOARD_NAME}/include)是板级配置的核心,包含了时钟、外设引脚、驱动使能等所有宏定义。在开始任何外设开发前,先来这里确认相关配置是否已经打开,比在代码里盲目调试高效得多。
搭建环境的过程,本质上是在理解和驯服一整套工具链。第一次可能会遇到各种问题,但每一个问题的解决都会让你对这套开发体系的认知加深一层。当你的代码最终在板子上如期运行时,那种成就感就是最好的回报。这套基于Ubuntu、CMake、OpenOCD和VS Code的环境,一旦跑顺,其高效和强大的扩展能力,会让你在后续复杂的项目开发中游刃有余。
