ebiobiz头像
关注
Nimmake for RISC-V — 让 RISC-V 固件构建像写 Python 一样简单封面图

Nimmake for RISC-V — 让 RISC-V 固件构建像写 Python 一样简单

🚀 Nimmake for RISC-V — 让 RISC-V 固件构建像写 Python 一样简单

告别手写复杂的 Makefile,用 Python 优雅地管理 RISC-V 嵌入式项目。
Nimmake 是一款专为嵌入式开发打造的轻量级跨平台构建工具原生支持 RISC-V 和 ARM 架构。基于 Python 驱动动,内置丰富的 MCU 配置和工具链预设,让你从繁琐的编译脚本中解放出来。


🎯 为什么 RISC-V 开发需要 Nimmake?

RISC-V 生态正在飞速发展,但构建工具链却依然碎片化:

痛点Nimmake 的解决方案
RISC-V 编译参数冗长难记(-march/-mabi/-mcmodel)内置预设配置 — RISCV_32_IMAC_CFG 开箱即用
外设库集成需要手动添加大量源文件和头文件路径Party 模块系统 — 自动扫描源码,自动管理 -I 和 -D
项目结构混乱,团队协作困难声明式 Python 配置,清晰可维护

—## 🔥 核心特性:⚡ 内置 RISC-V 预设配置设配置

Nimmake 内置了完整的 RISC-V 覆盖 32 位与 64 位架构:架构:

| 配置 | CPU | ABI | 适用场景 | ------------------- | ---------- | ------- | ----------------------- |
| RISCV_32_IMAC_CFG | rv32imac | ilp32 | CH32V 系列、GD32VF 系列 |列 |
| RISCV_64_GC_CFG | rv64gc | lp64d高性能 RISC-V 64 位芯片,仅需一行代码即可加载:加载:

from nimmake.datasets import RISCV_32_IMAC_CFG

CFG = RISCV_32_IMAC_CFG.clone()
CFG.set("cpu", "rv32imac_zicsr_zifencei")  # 自定义扩展
hlp.Config(CFG)

自动生成的编译标志示例:

`-mabi=ilp32 -march=rv32imac_zicsr_zifencei -mcmodel=medany -O2 -Wal### 🧩 Party 模块系统 — 告别手动源码管理管理源码

将代码组织为逻辑模块(Party),Nimmake 自动处理:

  • 源码扫描 — 自动递归扫描目录下的 .c/.S 文件
  • 头文件路径 — 自动添加 -I 包含路径
  • 宏定义 — 自动注入 -D 宏定义
  • 依赖管理 — 模块间依赖关系自动排序
# 定义代码模块
core = hlp.Parties("CORE", "Core", params=PARTY_PARAM)
driver = hlp.Parties("Driver", "Peripheral",
    defines={"CH32V20x_D6": ""},
    params=PARTY_PARAM,
)
user = hlp.Parties("USER", "User", params=PARTY_PARAM)

# 声明依赖关系(自动处理编译顺序)
core.DependOn([driver, user])
driver.DependOn([core, useuser.DependOn([core, driver])

🔧 多工具链无缝切换,多种编译器自由切换:随意切换:

# RISC-V GCC
ToolChain_riscv = {
    "TOOLPATH": r"D:\LLVM\xpack-riscv-none-elf-gcc-15\bin",
    "TOOL": "gcc",
    "TOOL_PREFIX": "riscv-none-elf-",
}

# 也可以切换到 LLVM/Clang 或 ARM GCC
ToolChain_clang = {
    "TOOLPATH": r"D:\LLVM\ETArm\bin",
    "TOOL": "clang",
    "TOOL_PREFIX": "",
}

hlp.Update(ToolChain_riscv)
hlp.Refresh()

⚡ 极速构建体验

  • 增量编译 — 只编译变大幅减少等待
  • 多进程并行程并行** — -j 参数充分利用多核
  • 构建缓存 — --ca 让二次构建速度快到飞起建快到飞起
  • Ninja 后端 — -n 模式获得极致速度
  • Dry-Run 模式 — --dry-run 预览构## 📦 快速上手:CH32V20x RISC-V 实战:沁恒 CH32V20x(RISC-V)完整构建外设库与应用程序: 应用程序:

1️⃣ 项目结构

project/
├── Nimmake.py          # 构建脚本(替代 Makefile)
├── Core/               # 核心代码
│   ├── core_riscv.c
│   └── core_riscv.h
├── Debug/              # 调试模块
│   ├── debug.c
│   └── debug.h
├── Peripheral/         # 外设驱动库
│   ├── inc/            # 头文件
│   └── src/            # 源文件(自动扫描)
├── Startup/            # 启动文件
│   └── startup_ch32v20x_D6.s
├── User/               # 用户应用
│   ├── main.c
│   ├── system_ch32v20x.c
│   └── ch32v20x_it.c
└── Ld/
    └── Link.ld         # 链接脚本

2️⃣ 编写 Nimmake.py

from nimmake.datasets import RISCV_32_IMAC_CFG
from nimmake.Helper import Helper

# 工具链路径
toolpath_riscv = r"D:\LLVM\xpack-riscv-none-elf-gcc-15\bin"
toolchain = {
    "TOOLPATH": toolpath_riscv,
    "TOOL": "gcc",
    "TOOL_PREFIX": "riscv-none-elf-",
}

hlp = Helper()

# 1. 芯片配置
CFG = RISCV_32_IMAC_CFG.clone()
CFG.set("cpu", "rv32imac_zicsr_zifencei")
hlp.Config(CFG)
hlp.set_cfg("linkscript", "LD/Link.ld")

# 2. 工具链配置
hlp.Update(toolchain)
hlp.Refresh()

# 3. Party 模块定义
PARTY_PARAM = {
    "CPU": hlp._cfg.cpu,
    "ABI": hlp._cfg.abi,
    "FPU": hlp._cfg.fpu,
    "MODEL": hlp._cfg.model,
}

core = hlp.Parties("CORE", "Core", params=PARTY_PARAM)
debug = hlp.Parties("DEBUG", "Debug", params=PARTY_PARAM)
user = hlp.Parties("USER", "User", params=PARTY_PARAM)
driver = hlp.Parties("Driver", "Peripheral",
    defines={"CH32V20x_D6": ""},
    params=PARTY_PARAM,
)

# 4. 依赖关系
core.DependOn([driver, debug, user])
driver.DependOn([core, user])

# 5. 构建目标
lib = hlp.Library_STATIC("driver")    # 静态库
hlp.DefaultTarget(lib)

3️⃣ 一键构建

# 安装
pip install nimmake

# 构建
cd project/
nimmake

# 预览编译命令
nimmake --dry-ru## 🌟 实际编译命令对比数,容易出错。

### Nimmake 自动生成

编译 C 文件

riscv-none-elf-gcc -c -mabi=ilp32 -mcmodel=medany
-march=rv32imac_zicsr_zifencei -O2 -Wall -g
-fdata-sections -ffunction-sections -std=gnu99
-DCH32V20x_D6
-IDebug -IPeripheral/inc -IUser -ICore
Core/core_riscv.c -o BUILD/OBJ/CORE/core_riscv.o

编译汇编启动文件

riscv-none-elf-gcc -c -mabi=ilp32 -march=rv32imac_zicsr_zifencei
Startup/startup_ch32v20x_D6.s -o BUILD/OBJ/_DEFAULT/startup_ch32v20x_D6.o

链接

riscv-none-elf-gcc -mabi=ilp32 -march=rv32imac_zicsr_zifencei
-nostartfiles “-Wl,–gc-sections” “-TLd/Link.ld”
-lm -lc -lgccBUILD/OBJ/CORE/core_riscv.o BUILD/OBJ/DEBUG/debug.o BUILD/OBJ/USER/main.o BUILD/OBJ/DRIVER/.oVER/.o
-o BUILD/test.el

Nimmake 自动处理了所有 -march、-mabi、-mcmodel、-I、-D你仅需关注业务代码!关注业务代码!


📊 与其他构建工具对比

特性NimmakeMakefileCMakeGN
RISC-V 预设配置✅ 内置❌ 手写❌ 手写❌ 手写
Party 模块系统✅ 声明式❌ 繁琐⚠️ 复杂⚠️ 复杂
增量编译✅ 内置⚠️ 需配置✅ 内置✅ 内置
多工具链切换✅ 一键切换❌ 手写✅ 内置❌ 需适配
学习成本🔥 低(Python)❌ 高⚠️ 中⚠️ 中
内建 FreeRTOS/LVGL 等✅ 即插即用❌ 需手动❌ 需手动❌ 需手动

🎯 适用场景

场景说明
🏭 RISC-V MCU 量产项目CH32V、GD32VF、ESP32-C 等系列
🔬 RISC-V 研究/教学快速搭建实验环境,专注于算法和架构
🚀 快速原型验证从零搭建编译环境只需几分钟
👥 团队协作统一构建系统,消除环境差异
🔄 CI/CD 集成纯命令行驱动,轻松集成流水线

📦 安装与资源

# 安装
pip install nimmake

# 验证
nimmake --version

# 查看 RISC-V 示例
git clone https://github.com/pophu/nimmake.git
cd nimmake/samples/07_riscv32
nimmake
资源链接
GitHub 仓库https://github.com/pophu/nimmake
PyPIpip install nimmake
问题反馈https://github.com/pophu/nimmake/issues

💬 结语

构建工具,专为 RISC-V 开发而生RISC-V 开发)而生的构建工具。如果你还在不妨试试 Nimmake。ile,不妨试试 Nimmake。用 Python 的优雅,驾驭 RISC-V 的强大。

立即体验:

pip install nimmake && nimmake --help

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/ebiobiz/article/details/165584864

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--