HPM6750 RISC-V开发:Ubuntu环境搭建与CMake构建实战

📅 2026/7/30 16:19:02
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. 环境搭建全流程解析与实操要点搭建环境听起来简单无非是装系统、装软件但其中有很多细节直接决定了你后续开发的顺畅度。是使用实体机、虚拟机还是WSLUbuntu版本如何选择网络环境如何配置每一步都有讲究。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核以上内存至少4GB8GB更佳。网络连接选择“桥接模式”这样虚拟机将获得一个独立的局域网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等基础编译工具是后续一切的基础。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保存退出CtrlX然后按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来获取并推荐使用--depth1参数只克隆最新提交以节省时间和空间。cd ~ git clone --depth1 https://github.com/hpmicro/hpm-sdk.git如果网络不畅可以考虑使用Gitee镜像https://gitee.com/hpmicro/hpm-sdk.git。初始化SDK与子模块SDK依赖一些子模块如特定芯片的组件包。进入SDK目录并初始化。cd hpm-sdk # 同步子模块同样可以加--depth1 git submodule update --init --recursive --depth1这个过程可能会花费一些时间取决于你的网络。安装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 -DBOARDhpm6750evkmini -DAPPled_blinky ../..-G Ninja: 指定生成Ninja格式的构建文件。-DBOARDhpm6750evkmini: 定义目标开发板型号这个变量会被SDK的CMake脚本读取以链接正确的板级支持包和链接脚本。-DAPPled_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的设备。安装OpenOCDOpenOCD是一个开源的片上调试器用于连接调试器和目标芯片。HPM SDK提供了定制化的OpenOCD版本。我们通常不需要单独安装因为SDK的scripts目录下已经包含了预编译好的openocd可执行文件并且配置好了HPM6750的芯片支持包。确保其有执行权限chmod x ~/hpm-sdk/tools/openocd/openocd4.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并连接。cd ~/hpm-sdk/build/evkmini_led_blinky riscv-none-elf-gdb led_blinky.elf在GDB命令行中(gdb) target remote localhost:3333 (gdb) load # 加载程序 (gdb) monitor reset halt # 复位并暂停CPU (gdb) b main # 在main函数设断点 (gdb) continue # 运行到断点这样就可以进行单步、查看变量等调试操作了。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文件夹。按CtrlShiftP输入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.txtcmake命令执行的路径不对或者-DAPP指定的目录名错误。确保在build目录下执行cmake且-DAPP的值必须是samples/下存在的子目录名。仔细检查拼写。fatal error: board.h: No such file or directorySDK子模块未初始化完整或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.rulesSUBSYSTEMusb, ATTR{idVendor}0d28, MODE0666(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 cdhpmcd ~/hpm-sdk alias build-ledcd ~/hpm-sdk/build/evkmini_led_blinky ninja alias flash-ledcd ~/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_LAUNCHERccache -DCMAKE_CXX_COMPILER_LAUNCHERccache参数即可启用。保持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的环境一旦跑顺其高效和强大的扩展能力会让你在后续复杂的项目开发中游刃有余。