build: 删除 MDK-ARM/build.bat,@build 完全收敛到 keil-build skill
- test/run_all_suites.py 是唯一真正执行它的地方:BUILD_BAT 常量改为 KEIL_BUILD(.dsh/skills/keil-build/scripts/keil_build.py);两处构建点 改传 --timeout(脚本内超时先于 _run 超时触发,超时得 rc=1 + BUILD_FAIL 文案,而不是被 _run 杀掉) - AGENTS.md / keil-build SKILL.md / new-machine-setup SKILL.md:删除 "等价原生入口"口径,改为注明该文件已于 2026-10-10 删除 - 环境与部署 3 篇 / 项目架构总览 / README / MDK-ARM/README / download.bat 注释 / check_mem_numbers.py 提示串:移除 build.bat 引用 - 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-14 / N-18 (历史审计条目;doc-links 不校验裸文件名,保留不影响门禁) - 验证:keil_build.py --timeout 300 -> BUILD_OK / rc=0; run_all_suites.py --dry-run 正确解析 skill 路径;doc-links 123 文档通过
This commit is contained in:
@@ -24,9 +24,9 @@ whenToUse: 需要编译 Keil MDK 工程、验证代码改动是否 0 错误 0
|
||||
|
||||
**`@build` = 本 skill**(2026-10-10 起为仓库文档口径):在仓库根目录跑
|
||||
`& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py`。
|
||||
仓库原生入口 `& "MDK-ARM\build.bat"` 与本 skill 判定口径一致
|
||||
(先删旧日志 → `-b -j0 -o` → 无 `error:` 且含 `0 Error(s), 0 Warning(s)`),
|
||||
**等价可用**,但它无超时保护、UV4 只认 `DTU_KEIL_UV4`、失败时 dump 整份日志 → 默认走本 skill。
|
||||
判定口径(与原 `MDK-ARM/build.bat` 同款;该文件已于 2026-10-10 删除,本 skill 即 `@build`):
|
||||
先删旧日志 → `-b -j0 -o` → 无 `error:` 且含 `0 Error(s), 0 Warning(s)`。
|
||||
本 skill 另有超时保护、UV4 多级解析链(含 PATH 兜底)、失败只打报错行。
|
||||
环境变量 `DTU_KEIL_UV4`(用户级,指向 UV4.exe)。
|
||||
|
||||
## 铁律与陷阱(实测教训)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
(环境变量**显式设了但路径无效 = 立即报错,不静默回退**)
|
||||
日志 --log > 档案 "build_log" > <工程目录>\\build_log.txt
|
||||
|
||||
判定口径(与仓库 build.bat 一致,实测教训沉淀):
|
||||
判定口径(实测教训沉淀;原仓库 MDK-ARM/build.bat 已删除,本脚本即 @build):
|
||||
1. 先删旧日志——UV4 -o 只在真跑了构建才写日志,残留旧日志会被当成本次结果
|
||||
2. UV4 单实例:IDE 开着时 -b 可能被转发给 IDE(退出码丢失)→ 只 WARN 不杀进程
|
||||
3. PASS = 日志存在 + 无 "error:"(大小写不敏感)+ 含 "0 Error(s), 0 Warning(s)"
|
||||
|
||||
@@ -40,7 +40,7 @@ whenToUse: 换新机器/新克隆要把环境搭起来、构建或烧录报"环
|
||||
## 实测坑(本会话两次撞上)
|
||||
|
||||
- **agent/服务派生的 shell 不继承"服务启动之后"设置的用户级环境变量**:
|
||||
`keil_build.py`(或等价的 `build.bat`)报 exit 2 先分清"真没设"还是"没继承"——查
|
||||
`keil_build.py` 报 exit 2 先分清"真没设"还是"没继承"——查
|
||||
`[Environment]::GetEnvironmentVariable('DTU_KEIL_UV4','User')`,有值就
|
||||
`$env:DTU_KEIL_UV4 = <该值>` 注入当前会话再跑,别急着让用户重设。
|
||||
(`env_check.py` 对这种情况报 WARN 并给注入命令。)
|
||||
|
||||
@@ -15,7 +15,7 @@ STM32F407ZGTx @168MHz(HSE 8MHz → PLL M=4/N=168/P=2);**仅 Keil MDK-ARM v
|
||||
|
||||
## 构建与验证
|
||||
|
||||
- `@build` = **`keil-build` skill**:`& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py`(仓库根目录执行;纯标准库,任意 python3 亦可)。退出码 0 = 0 错误 0 警告(PASS)、1 = 构建失败(打印报错行)、2 = UV4 未找到/无效、3 = 用法错误。UV4 解析链 `--uv4` > `.serialtest/config.json` 的 `uv4` > `$DSH_KEIL_UV4` > `$DTU_KEIL_UV4` > PATH(**显式设了但无效 = 立即报错、不静默回退**);日志 `MDK-ARM/build_log.txt`。**仓库原生入口 `& "MDK-ARM\build.bat"` 判定口径完全一致(先删旧日志 → `-b -j0 -o` → 无 `error:` 且含 `0 Error(s), 0 Warning(s)`),等价可用**——但它无超时保护、UV4 只认 `DTU_KEIL_UV4`、失败时 dump 整份日志,故默认走 skill。换机必设 `DTU_KEIL_UV4`,见 `docs/环境与部署/本地工具路径环境变量方案.md`
|
||||
- `@build` = **`keil-build` skill**:`& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py`(仓库根目录执行;纯标准库,任意 python3 亦可)。退出码 0 = 0 错误 0 警告(PASS)、1 = 构建失败(打印报错行)、2 = UV4 未找到/无效、3 = 用法错误。UV4 解析链 `--uv4` > `.serialtest/config.json` 的 `uv4` > `$DSH_KEIL_UV4` > `$DTU_KEIL_UV4` > PATH(**显式设了但无效 = 立即报错、不静默回退**);日志 `MDK-ARM/build_log.txt`。⚠ **原 `MDK-ARM/build.bat` 已于 2026-10-10 删除**(判定口径同款,但无超时保护、UV4 只认 `DTU_KEIL_UV4`、失败时 dump 整份日志);`test/run_all_suites.py` 已改调本 skill。换机必设 `DTU_KEIL_UV4`,见 `docs/环境与部署/本地工具路径环境变量方案.md`
|
||||
- `@test` / `.dsh/skills/serial-boot-test/scripts/run_boot_test.py` 一键闭环(2026-09-20 起为纯 Python 标准库实现,替代 PowerShell 版;`& '.venv\Scripts\python.exe' .dsh/skills/serial-boot-test/scripts/run_boot_test.py`):开串口+清日志 → 烧录(`MDK-ARM/download.bat`,下载后 Reset&Run;快路径 `--flash-cmd "MDK-ARM\reset.bat flash"`)→ **固件身份戳**(从刚烧进去的 hex 里抠 `fw build: <DATE> <TIME>` 追加成 Required 标记)→ wait-idle(等 RX 静默 8s,超时 30s,首字节 12s 未到判 `no_data`)→ 提取日志 → **烧录回读校验**(`reset.bat cmp` = `-CmpFile`;不一致 = 本次运行作废 exit 2)→ `.dsh/skills/serial-boot-test/scripts/verify_log.py` 标记校验(含**启动锚点计数**:`reset cause:` 出现 0 次或 >1 次 = FAIL,`--max-boot-count` 调;Forbidden 命中**逐行打印行号+内容**;boot_log 每行带 `[+Nms]` daemon 毫秒时基 → 可查标记顺序 `--require-order` 与开机耗时 `--done-marker`/`--max-boot-ms`,实测 `net init: OK` = **+537ms**);退出码 0=PASS / 1=FAIL / 2=采集或烧录错误(含回读不一致)/ 3=用法/预检错误
|
||||
- 默认校验标记:Required `App init OK` / `Network Init` / `net init: OK` + **自动追加的固件身份戳 `fw build: <__DATE__> <__TIME__>`**(`App/app/app_main.c` 开机打印,`run_boot_test.py` 从待烧 hex 里抠出该串当 Required——此前所有标记都是固定串,**旧镜像/错镜像照样全中**,"反复重下载、芯片一直是旧镜像"在自动闭环里不可见,2026-10-10 补;`--no-fw-check` 关闭);Forbidden `FAIL` / `ERROR` / `HardFault` / `[ERR]`(**四个 Fault 的崩溃日志都以 `[ERR]` 开头 → 一律判 FAIL**,这是刻意的:出现 Fault 即本次运行不通过);按模块定制标记(网络/存储/RTC/ADC/RS485/UI)见 `docs/测试说明/自动化测试流程.md`
|
||||
- ⚠️ 旧绝对路径 `D:\Code\DTU 程序\...` 出现即失效(仓库已搬迁),一律改用仓库相对路径
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
| `STM32F407-Demo.uvprojx` | **Keil 工程文件**(源文件清单、编译选项、目标配置) |
|
||||
| `STM32F407-Demo.uvoptx` | Keil 用户选项(调试器、断点等) |
|
||||
| `startup_stm32f407xx.s` | 启动文件(**`Heap_Size EQU 0x200`(512B)在此限定**) |
|
||||
| `build.bat` | 命令行编译(**等价原生入口**;`@build` 现由 `keil-build` skill 承担。退出码 0=0 错 0 警;日志 `build_log.txt`) |
|
||||
| `download.bat` | 烧录(UV4 路径) |
|
||||
| `reset.bat` | **复位/烧录**(`ST-LINK_CLI`,见下) |
|
||||
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
set PROJ=%~dp0STM32F407-Demo.uvprojx
|
||||
set LOG=%~dp0build_log.txt
|
||||
set TARGET=STM32F407-Demo
|
||||
|
||||
:: UV4 location: env var DTU_KEIL_UV4 = full path of UV4.exe.
|
||||
:: Required on any MCU build machine; there is NO machine-default fallback
|
||||
:: (no C:\Keil_v5 guess). Set it once per machine, user scope (no admin):
|
||||
:: [Environment]::SetEnvironmentVariable('DTU_KEIL_UV4', 'D:\Tools\Keil\UV4\UV4.exe', 'User')
|
||||
:: then reopen the terminal. Full contract: the DTU_* env var plan document
|
||||
:: in docs/ (local tool path env vars plan).
|
||||
if defined DTU_KEIL_UV4 goto uv4_set
|
||||
echo BUILD_FAIL: environment variable DTU_KEIL_UV4 is not set
|
||||
echo Set it to the full path of UV4.exe, e.g.:
|
||||
echo [Environment]::SetEnvironmentVariable('DTU_KEIL_UV4', 'D:\Tools\Keil\UV4\UV4.exe', 'User')
|
||||
exit /b 2
|
||||
|
||||
:uv4_set
|
||||
if exist "%DTU_KEIL_UV4%" goto uv4_ok
|
||||
echo ENV_ERROR: DTU_KEIL_UV4 is set but does not exist: "%DTU_KEIL_UV4%"
|
||||
echo Fix the variable value. No fallback to another UV4 install is attempted.
|
||||
exit /b 2
|
||||
|
||||
:uv4_ok
|
||||
set UV4=%DTU_KEIL_UV4%
|
||||
|
||||
:: UV4 is single-instance: if an IDE process is alive, this -b call may be
|
||||
:: forwarded to it (exit code is lost, GUI may open). Warn only; never kill.
|
||||
tasklist /fi "imagename eq UV4.exe" /nh | find /i "UV4.exe" >nul
|
||||
if not errorlevel 1 echo WARNING: UV4 IDE is running - this build may be forwarded to the IDE. Close it for a deterministic CLI build.
|
||||
|
||||
:: Remove stale log first: UV4 -o writes the log only when a build actually
|
||||
:: runs. A leftover log would otherwise be misreported as this build's result.
|
||||
if exist "%LOG%" del "%LOG%"
|
||||
|
||||
"%UV4%" -b "%PROJ%" -t%TARGET% -j0 -o "%LOG%"
|
||||
|
||||
if not exist "%LOG%" (
|
||||
echo BUILD_FAIL: no build log produced - UV4 did not run or hung
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Error diagnostics in the log: ARMCC V5 "file(line): error: #NN" and
|
||||
:: "no source: Error: #5" both contain "error:"; a 0E0W log never does.
|
||||
findstr /I /C:"error:" "%LOG%" >nul
|
||||
if not errorlevel 1 (
|
||||
echo BUILD_FAIL: error diagnostics in build log
|
||||
type "%LOG%"
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
:: Success proof: exact 0E0W summary line (also rejects warning-only builds).
|
||||
findstr /C:"0 Error(s), 0 Warning(s)" "%LOG%" >nul
|
||||
if errorlevel 1 (
|
||||
echo BUILD_FAIL: no 0E0W marker in build log
|
||||
type "%LOG%"
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo BUILD_OK: 0 errors, 0 warnings
|
||||
exit /b 0
|
||||
@@ -6,7 +6,7 @@ set LOG=%~dp0download_log.txt
|
||||
set TARGET=STM32F407-Demo
|
||||
|
||||
:: UV4 location: env var DTU_KEIL_UV4 = full path of UV4.exe (same contract
|
||||
:: as build.bat; required, no machine-default fallback).
|
||||
:: as keil_build.py (@build); required, no machine-default fallback).
|
||||
if defined DTU_KEIL_UV4 goto uv4_set
|
||||
echo DOWNLOAD_FAIL: environment variable DTU_KEIL_UV4 is not set
|
||||
echo Set it to the full path of UV4.exe, e.g.:
|
||||
@@ -24,7 +24,7 @@ set UV4=%DTU_KEIL_UV4%
|
||||
|
||||
:: Remove stale log first: UV4 -o writes the log only when a download actually
|
||||
:: runs. A leftover log would otherwise be misreported as this download's
|
||||
:: result (same guard as build.bat).
|
||||
:: result (same guard as keil_build.py).
|
||||
if exist "%LOG%" del "%LOG%"
|
||||
|
||||
"%UV4%" -f "%PROJ%" -t%TARGET% -j0 -o "%LOG%"
|
||||
|
||||
@@ -144,7 +144,6 @@ STM32F4-Base/
|
||||
│ └── Third_Party/FreeRTOS/ # FreeRTOS 内核
|
||||
├── MDK-ARM/ # Keil 工程
|
||||
│ ├── STM32F407-Demo.uvprojx # 工程文件
|
||||
│ ├── build.bat # 命令行编译脚本
|
||||
│ ├── download.bat # 烧录脚本
|
||||
│ ├── reset.bat # 复位 / 烧录(ST-LINK_CLI)
|
||||
│ ├── *_probe.py # 台架探针(TCP 复连 / FTP 中止等)
|
||||
@@ -213,7 +212,7 @@ STM32F4-Base/
|
||||
### 编译
|
||||
|
||||
```bash
|
||||
# 方式一:命令行编译(推荐;= keil-build skill,等价原生入口 MDK-ARM\build.bat)
|
||||
# 方式一:命令行编译(推荐;= keil-build skill)
|
||||
& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py
|
||||
|
||||
# 方式二:Keil IDE
|
||||
@@ -373,7 +372,7 @@ pre-commit run --all-files
|
||||
| `Drivers/BSP/CH395F/ch395f.c` | 以太网控制器驱动 |
|
||||
| `Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c` | NAND Flash 驱动 |
|
||||
| `Drivers/BSP/NET/net_socket.c` | BSD Socket API |
|
||||
| `MDK-ARM/build.bat` | 编译脚本 |
|
||||
| `.dsh/skills/keil-build/scripts/keil_build.py` | 编译脚本(`@build`) |
|
||||
| `.dsh/skills/serial-boot-test/scripts/run_boot_test.py` | 自动化测试脚本 |
|
||||
|
||||
## 已知问题
|
||||
|
||||
+1
-1
@@ -297,7 +297,7 @@ flowchart LR
|
||||
|
||||
| 目标 | 工具链 | 验证 |
|
||||
|---|---|---|
|
||||
| MCU 固件 | Keil MDK-ARM v5(`@build` = `keil-build` skill;原生入口 `MDK-ARM/build.bat` 等价) | `@build` 0 错 0 警 → `@test` 串口闭环 |
|
||||
| MCU 固件 | Keil MDK-ARM v5(`@build` = `keil-build` skill) | `@build` 0 错 0 警 → `@test` 串口闭环 |
|
||||
| PC 模拟器 | CMake + SDL2 + MSVC(`simulator/build/`) | `check_menu_rows.py` + `check_content_pages.py`(文本断言 + 像素黄金参考) |
|
||||
|
||||
**功能编译开关**:`App/app/app_cfg.h`(网络/ADC/RS485);`test/board/test_config.h` 测试套件互斥选择(产品构建全注释)。
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
| 变量 | 必需性 | 值的形态 | 使用者 | 默认/回退 |
|
||||
|---|---|---|---|---|
|
||||
| `DTU_KEIL_UV4` | MCU 构建/下载机必需 | UV4.exe 完整路径,例如 `D:\Tools\Keil\UV4\UV4.exe` | `keil_build.py`(`@build`)、`build.bat`、`download.bat` | 不设即报错(exit 2);不从 C 盘旧路径猜测 |
|
||||
| `DTU_KEIL_UV4` | MCU 构建/下载机必需 | UV4.exe 完整路径,例如 `D:\Tools\Keil\UV4\UV4.exe` | `keil_build.py`(`@build`)、`download.bat` | 不设即报错(exit 2);不从 C 盘旧路径猜测 |
|
||||
| `DTU_STLINK_CLI` | 复位/烧录/回读机必需 | `ST-LINK_CLI.exe` 完整路径,例如 `C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\ST-LINK Utility\ST-LINK_CLI.exe` | `reset.bat` | 未设时回退 PATH(`where ST-LINK_CLI.exe` 首个命中);已设但无效 = 硬报错 |
|
||||
| `DTU_PRECOMMIT_PYTHON` | 可选(覆盖用) | 含 `pre_commit` 模块的 `python.exe` 完整路径 | `ci_local.py` L0、CI `l0-gates` | 未设时按 §1.1 探测(当前解释器 → `.venv` → PATH);已设但无效 = 硬报错 |
|
||||
| `DTU_GRAPHVIZ_DOT` | 可选(覆盖用) | `dot.exe` 完整路径 | `gen_refgraph.py` | 未设时只查 PATH;无 Graphviz 时降级为"生成 .dot/.json、跳过渲染" |
|
||||
|
||||
@@ -65,7 +65,7 @@ Graphviz / Cppcheck 的安装位置差异一律用 `DTU_*` 环境变量表达(
|
||||
|
||||
| 变量 | 必需性 | 值的形态 | 使用方 |
|
||||
|---|---|---|---|
|
||||
| `DTU_KEIL_UV4` | **必需**(MCU 构建/Keil 下载机) | UV4.exe 完整路径 | `keil_build.py`(`@build`)、`MDK-ARM/build.bat`、`download.bat` |
|
||||
| `DTU_KEIL_UV4` | **必需**(MCU 构建/Keil 下载机) | UV4.exe 完整路径 | `keil_build.py`(`@build`)、`download.bat` |
|
||||
| `DTU_STLINK_CLI` | **必需**(用 ST-LINK CLI 的机器;已在 PATH 可不设) | ST-LINK_CLI.exe 完整路径 | `MDK-ARM/reset.bat`(烧录/复位/回读) |
|
||||
| `DTU_PRECOMMIT_PYTHON` | 可选(pre-commit 不在 `.venv`/当前解释器时设;CI runner 建议必设) | 装有 pre-commit 的 python.exe 完整路径 | `scripts/ci_local.py`、CI L0/L0.5 |
|
||||
| `DTU_CPPCHECK` | 可选(开发机入 PATH 即可;无 PATH 的 CI runner 建议设) | cppcheck.exe 完整路径 | pre-commit cppcheck 钩子、CI L0 |
|
||||
@@ -91,10 +91,10 @@ Graphviz / Cppcheck 的安装位置差异一律用 `DTU_*` 环境变量表达(
|
||||
| 项 | 要求 | 说明 |
|
||||
|---|---|---|
|
||||
| Keil MDK-ARM | **v5.x**(须含 ARMCC v5 编译器) | 工程锁定 `uAC6=0`(仅 ARMCC v5,**不支持 armclang**);仅支持此工具链,无其他工具链 |
|
||||
| 安装路径 | **任意目录** | `keil_build.py` / `build.bat` / `download.bat` / `reset.bat` 经 `DTU_*` 环境变量解析工具路径(§2.1.1);新机器装完后设置 `DTU_KEIL_UV4` / `DTU_STLINK_CLI` 即可,**无需修改仓库脚本** |
|
||||
| 安装路径 | **任意目录** | `keil_build.py` / `download.bat` / `reset.bat` 经 `DTU_*` 环境变量解析工具路径(§2.1.1);新机器装完后设置 `DTU_KEIL_UV4` / `DTU_STLINK_CLI` 即可,**无需修改仓库脚本** |
|
||||
| 设备支持 | STM32F407ZGTx + CMSIS Flash 算法 | 工程引用 `STM32F4xx_1024.FLM`(1MB 片内 Flash,0x08000000),由 CMSIS STM32F4 设备包提供 |
|
||||
| STM32CubeMX | **6.17.0**(工程 `STM32F407-Demo.ioc` 记录的版本) | 修改外设/引脚/时钟配置并再生成 CubeMX 文件;固件包须 **STM32Cube FW_F4 V1.28.3** |
|
||||
| 命令行构建 | `& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py`(即 `@build`;原生入口 `MDK-ARM/build.bat` 等价) | 退出码 0 = 0 错 0 警;失败看 `MDK-ARM/build_log.txt` |
|
||||
| 命令行构建 | `& '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py`(即 `@build`) | 退出码 0 = 0 错 0 警;失败看 `MDK-ARM/build_log.txt` |
|
||||
| 命令行烧录 | `& "MDK-ARM\download.bat"`(即 `@download`) | flash + Reset & Run;日志出现 `Application running` 判成功 |
|
||||
|
||||
> ⚠ **版本一致性关键**:.ioc 记录 `MxCube.Version=6.17.0` + `FirmwarePackage=STM32Cube FW_F4 V1.28.3`,
|
||||
@@ -602,7 +602,7 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级
|
||||
|
||||
| 现象 | 原因 | 处理 |
|
||||
|---|---|---|
|
||||
| `keil_build.py` / `build.bat` / `download.bat` 报 `DTU_KEIL_UV4` 未设/无效 | `DTU_KEIL_UV4` 未设置或指向错误路径(**设完变量须重开终端**) | 设置/修正 `DTU_KEIL_UV4` 为 UV4.exe 完整路径(§2.1.1),重开终端重试 |
|
||||
| `keil_build.py` / `download.bat` 报 `DTU_KEIL_UV4` 未设/无效 | `DTU_KEIL_UV4` 未设置或指向错误路径(**设完变量须重开终端**) | 设置/修正 `DTU_KEIL_UV4` 为 UV4.exe 完整路径(§2.1.1),重开终端重试 |
|
||||
| `reset.bat` 报 `ST-LINK_CLI.exe not found` / `ENV_ERROR: DTU_STLINK_CLI` | `DTU_STLINK_CLI` 未设且不在 PATH,或显式值无效 | 设置 `DTU_STLINK_CLI` 为 ST-LINK_CLI.exe 完整路径,或把其目录加入 PATH;显式值无效时**不会**回退,须修值 |
|
||||
| Keil 编译报编译器不识别 | 新装 MDK 只有 armclang | 工程锁 `uAC6=0`,必须用带 **ARMCC v5** 的 MDK v5.x |
|
||||
| CubeMX 再生成后出现大量 diff / 新告警 | 用了比工程记录更新的 CubeMX / 固件包版本 | 用 git 还原生成文件,按 **.ioc 记录的 CubeMX 6.17.0 + STM32Cube FW_F4 V1.28.3** 重新生成 |
|
||||
|
||||
@@ -336,7 +336,7 @@ def main(argv):
|
||||
map_path = pathlib.Path(args.map)
|
||||
if not map_path.exists():
|
||||
print(f"[FAIL] 找不到 .map 事实源:{map_path}", file=sys.stderr)
|
||||
print(" 先跑一次 @build(或 MDK-ARM/build.bat)生成 .map。", file=sys.stderr)
|
||||
print(" 先跑一次 @build(keil-build skill)生成 .map。", file=sys.stderr)
|
||||
return 1
|
||||
|
||||
data = parse_map(map_path)
|
||||
|
||||
@@ -53,7 +53,7 @@ from pathlib import Path
|
||||
|
||||
REPO_ROOT = Path(__file__).resolve().parent.parent
|
||||
CONFIG = REPO_ROOT / "test" / "board" / "test_config.h"
|
||||
BUILD_BAT = REPO_ROOT / "MDK-ARM" / "build.bat"
|
||||
KEIL_BUILD = REPO_ROOT / ".dsh" / "skills" / "keil-build" / "scripts" / "keil_build.py"
|
||||
DOWNLOAD_BAT = REPO_ROOT / "MDK-ARM" / "download.bat"
|
||||
RUN_BOOT = REPO_ROOT / ".dsh" / "skills" / "serial-boot-test" / "scripts" / "run_boot_test.py"
|
||||
|
||||
@@ -147,7 +147,7 @@ def main(argv=None):
|
||||
return 2
|
||||
|
||||
# --check-build 不需要串口/烧录工具,故不强求 run_boot_test.py 存在
|
||||
required = (CONFIG, BUILD_BAT) if args.check_build else (CONFIG, BUILD_BAT, DOWNLOAD_BAT, RUN_BOOT)
|
||||
required = (CONFIG, KEIL_BUILD) if args.check_build else (CONFIG, KEIL_BUILD, DOWNLOAD_BAT, RUN_BOOT)
|
||||
for p in required:
|
||||
if not p.is_file():
|
||||
print("[ERROR] 缺文件:{}".format(p))
|
||||
@@ -157,7 +157,7 @@ def main(argv=None):
|
||||
print("=== 多套件回归编排 ===")
|
||||
print("模式:{}".format(mode))
|
||||
print("套件:{}".format(", ".join(picked)))
|
||||
print("构建:{}".format(BUILD_BAT))
|
||||
print("构建:{}".format(KEIL_BUILD))
|
||||
if not args.check_build:
|
||||
print("烧录:{}".format(DOWNLOAD_BAT))
|
||||
print("判读:{}".format(RUN_BOOT))
|
||||
@@ -180,8 +180,10 @@ def main(argv=None):
|
||||
print("################ {} ################".format(suite))
|
||||
_rewrite_config(macro)
|
||||
|
||||
# 1) 构建
|
||||
rc, out = _run([str(BUILD_BAT)], timeout=args.build_timeout)
|
||||
# 1) 构建(@build = keil-build skill;脚本内超时先于 _run 超时触发,
|
||||
# 超时会返回 rc=1 + BUILD_FAIL 文案,而不是被 _run 杀掉)
|
||||
rc, out = _run([py, str(KEIL_BUILD), "--timeout", str(args.build_timeout)],
|
||||
timeout=args.build_timeout + 60)
|
||||
tail = "\n".join(out.strip().splitlines()[-6:])
|
||||
print("[BUILD] rc={}".format(rc))
|
||||
if tail:
|
||||
@@ -246,7 +248,8 @@ def main(argv=None):
|
||||
if restored and not args.keep_config:
|
||||
print("")
|
||||
print("[..] 复位构建产物为产品态(重建一次产品固件,避免 .map 停留在测试套件态)...")
|
||||
rc, out = _run([str(BUILD_BAT)], timeout=args.build_timeout)
|
||||
rc, out = _run([py, str(KEIL_BUILD), "--timeout", str(args.build_timeout)],
|
||||
timeout=args.build_timeout + 60)
|
||||
tail = "\n".join(out.strip().splitlines()[-4:])
|
||||
if rc == 0:
|
||||
print("[OK] 产品固件已重建(.map/.axf 复位)")
|
||||
|
||||
Reference in New Issue
Block a user