Files
STM32F4-Base/.dsh/skills/mem-budget/scripts/mem_check.py
T

65 lines
2.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""mem_check.py - 跑项目的 RAM/栈报告(薄运行器,纯标准库)。
依次调用仓库的 ram_report.py 与 stack_report.py(路径可覆盖),打印各自退出码
与总结。用法(项目根目录):
python <skill>/scripts/mem_check.py [--ram-script scripts/ram_report.py]
[--stack-script scripts/stack_report.py] [--serial-log PATH] [--python PATH]
退出码: 0=两报告都过 / 1=任一 FAIL / 2=脚本缺失或用法错误。
"""
import argparse
import os
import subprocess
import sys
from pathlib import Path
def find_python(cli):
if cli:
return cli
for cand in (".venv/Scripts/python.exe", ".venv/bin/python"):
if Path(cand).is_file():
return cand
return sys.executable
def run(py, script, extra):
p = Path(script)
if not p.is_file():
print("MISSING: {}".format(p))
return 2
print("=== {} ===".format(p))
r = subprocess.run([py, str(p)] + extra)
return r.returncode
def main(argv=None):
for s in (sys.stdout, sys.stderr):
try:
s.reconfigure(encoding="utf-8", errors="replace")
except Exception:
pass
ap = argparse.ArgumentParser(description="run RAM/stack reports")
ap.add_argument("--ram-script", default="scripts/ram_report.py")
ap.add_argument("--stack-script", default="scripts/stack_report.py")
ap.add_argument("--serial-log", default=None,
help="serial log with [STACK] lines (overlay runtime watermarks)")
ap.add_argument("--python", default=None, help="interpreter (default .venv)")
args = ap.parse_args(argv)
py = find_python(args.python)
rc_ram = run(py, args.ram_script, [])
stack_extra = ["-s", args.serial_log] if args.serial_log else []
rc_stack = run(py, args.stack_script, stack_extra)
worst = max(rc_ram, rc_stack)
print("MEM_CHECK: ram={} stack={} -> {}".format(rc_ram, rc_stack,
"PASS" if worst == 0 else ("FAIL" if worst == 1 else "ERROR")))
return 0 if worst == 0 else (1 if worst == 1 else 2)
if __name__ == "__main__":
sys.exit(main())