图形化 Flash 分区配置与代码生成工具。
不想再手算 offset?不想在 http://draw.io、Excel 和头文件之间来回同步?cFlash 把 Flash 分区变成“看得见、改得快、能生成、好分享”的配置文件。
flechazo.mba by flechazo一个有情怀的程序员
https://github.com/FlechazoCLF
仓库链接:https://gitee.com/carlchai/c-flash
cFlash
flechazo
cFlash 用于维护嵌入式项目的 Flash 地址规划,并自动生成可在工程中引用的分区常量。它把 Flash 分区配置、可视化查看、JSON 保存和代码生成放到同一个工具里,让分区调整从“手工改地址”变成“图形化配置后一键生成”。
🧭 为什么需要 cFlash
Boot 项目开发里,Flash 划分通常会同时存在于设计图和代码中:先用 http://draw.io 画出分区,再手工把地址、大小、偏移写进头文件。每次修改分区时,设计图和代码都要同步更新,重复、容易出错,也不够直观。
cFlash 希望把这件事收敛到一个工具里,少一点手工同步,多一点确定性:
| 过去 | 现在 |
|---|---|
| 手工计算地址和偏移 | 🖱️ 在图形界面里直接配置 |
| 设计图和代码分开维护 | 📦 用 JSON 保存完整分区配置 |
| 手写一堆宏定义 | ⚙️ 自动生成 flash_map.h 或 flash_map.py |
| 分区改动靠口头同步 | 🤝 把 JSON 发出去,对方打开就是同一份布局 |
✨ 核心优势
- 🖱️配置方便:通过图形界面直接调整 Flash 基地址、总大小和各级分区,不需要反复手算偏移和地址。
- ⚙️生成方便:配置完成后可以直接生成
flash_map.h或flash_map.py,减少手写宏定义带来的遗漏和错误。 - 📦分享方便:分区信息统一保存在 JSON 文件中,把
database/cFlash.json发给别人,就可以快速查看、复用或继续修改同一份 Flash 规划。
一句话流程:
打开工具 ->配置分区 ->保存 JSON ->生成代码 ->放进工程cFlash
flechazo
🧰 功能特性
- 🧱 图形化展示 Flash 分区布局。
- 🧮 支持配置 Flash 基地址、总大小、编程页大小、擦除扇区大小和显示参数。
- 📝 支持新增、编辑、删除、清空分区。
- 🌳 支持父子分区关系,例如
FLASH_ROOT -> BankA -> AppA -> AppInfo。 - 📄 使用
database/cFlash.json保存配置。 - 🧾 生成 C 头文件
flash_map.h。 - 🐍 生成 Python 常量文件
flash_map.py。 - 📍 生成内容包含分区偏移、大小、起始地址和结束地址。
📌 当前状态
当前项目已经具备基础图形化配置和代码生成功能,仍处于持续完善阶段。
| 项目 | 状态 |
|---|---|
| 图形化 Flash 分区编辑 | ✅ 已支持 |
| JSON 配置保存 | ✅ 已支持 |
| C 头文件生成 | ✅ 已支持 |
| Python 常量文件生成 | ✅ 已支持 |
| C++ / Java 生成 | 🧩 预留 |
| 安装包或发布包 | 📝 待完善 |
| 开源许可证 | 📝 待补充 |
🛠️ 环境要求
- Qt 5 或 Qt 6,需包含 Widgets 模块。
- Qt Creator,或支持 qmake 的命令行构建环境。
- 支持 C++17 的编译器。
工程文件为:
🏗️ 构建方式
Qt Creator
- 使用 Qt Creator 打开
cByte.pro。 - 选择支持 Widgets 的 Qt Kit。
- 构建并运行工程。
命令行
在 Windows MinGW 环境下,执行qmake后使用对应的mingw32-make命令。
⚡ 快速开始
- 🚀 启动 cFlash。
- 📂 打开或编辑默认配置文件
database/cFlash.json。 - 🖱️ 在 Flash 分区视图中右键新增、编辑或删除分区。
- 🧱 双击根分区编辑 Flash 全局参数。
- 💾 保存 JSON 配置。
- ⚙️ 通过代码生成菜单导出
flash_map.h或flash_map.py。 - 📦 将生成文件放入目标嵌入式工程中使用,或将 JSON 配置发给其他成员查看和协作修改。
📄 配置格式
默认配置文件为:
示例:
{"name":"cFlash","version":"1.0.0","flash":{"base_address":"0x0","total_size":"2097152","program_page_size":"256","erase_sector_size":"2048"},"blocks":[{"name":"FLASH_ROOT","parent":"","offset":"0","size":"2097152","info":"chip flash root"}]}blocks中的每一项表示一个 Flash 分区:
| 字段 | 说明 |
|---|---|
| name | 分区名称,也是生成宏名的来源。 |
| parent | 父分区名称,空字符串表示根分区。 |
| offset | 相对父分区的偏移。 |
| size | 分区大小,单位为字节。 |
| info | 分区说明,会写入生成文件的注释中。 |
| color | 图形界面中的显示颜色。 |
| color_enable | 是否启用该分区的显示颜色。 |
绝对地址计算方式:
absolute_offset=parent offset chain + current offset address=FLASH_BASE_ADDRESS + absolute_offset⚙️ 生成结果
🧾 C 头文件
cFlash 可以生成flash_map.h。
示例:
#define FLASH_BASE_ADDRESS (0x0)#define FLASH_TOTAL_SIZE (0x200000)#define FLASH_PROGRAM_PAGE_SIZE (0x100)#define FLASH_ERASE_SECTOR_SIZE (0x800)#define APPA_OFFSET (0x60000)#define APPA_SIZE (0xA0000)#define APPA_ADDR (FLASH_BASE_ADDRESS + APPA_OFFSET)#define APPA_END_ADDR (APPA_ADDR + APPA_SIZE)🐍 Python 常量文件
cFlash 也可以生成flash_map.py,用于让脚本或其他工具复用同一份 Flash 分区配置。
🗂️ 工程结构
cFlash/ ├── cByte.pro qmake 工程文件 ├── main.cpp 应用入口 ├── cbyte.cpp/.h 主窗口 ├── database/ │ └── cFlash.json 默认 Flash 分区配置 ├── display/ 图形显示、菜单、鼠标交互和分区编辑 ├── generator/ 代码生成逻辑 │ ├── generator_c/ C 生成器预留模块 │ ├── generator_cpp/ C++ 生成器预留模块 │ └── generator_python/ Python 生成器预留模块 └── kernel/ 基础类型、文件操作和 trace 支撑🗺️ 后续计划
- 完善同级分区重叠检查。
- 恢复并完善显示颗粒度、编程页大小、擦除扇区大小等对齐检查。
- 在生成输出文件前强制执行配置校验。
- 将 C/Python 生成逻辑拆分到独立的生成器后端中。
- 在 JSON 中增加
schema_version,并支持后续配置迁移。 - 增加工程级输出设置,例如默认输出目录、文件名、宏前缀和地址基准。
- 增加输出预览或覆盖前 diff 确认。
- 补充发布包和安装说明。
- 补充开源许可证文件。
⚠️ 已知限制
- 部分对齐检查逻辑已经存在,但当前仍处于禁用状态。
cc_display_protocol_validate()已经准备了children_map,但同级分区重叠检查还需要补齐。- 生成的 C 头文件 include guard 当前固定为
_FLASH_MAP_H,多个工程或多份分区表并存时可能需要改成可配置。 cByte.pro.user是 Qt Creator 本地用户配置文件,不应提交到仓库。
🤝 参与贡献
欢迎大家通过 Issue 和 Pull Request 参与改进。
推荐优先完善的方向:
- Flash 分区合法性校验。
- 代码生成后端整理。
- JSON schema 和版本迁移。
- 发布包制作。
- UI 易用性优化。