cortex-memory-budget
Static flash/RAM footprint analysis for ARM Cortex-M binaries — CI-friendly, framework-agnostic, zero runtime dependencies.
cortex-memory-budget analyzes an ELF binary (via arm-none-eabi-objdump,
nm, and addr2line) and reports how much flash and RAM your
firmware consumes, broken down by memory region, section, symbol, and
source file. Pre-allocated stack and heap are detected via linker
symbols with section-based fallback.
It supports Cortex-M0, Cortex-M4, Cortex-M7, and Cortex-M33 and is designed for resource-constrained MCUs where every kilobyte of flash and every byte of RAM matters.
✨ Features
| Feature | Status |
|---|---|
| Cortex-M0 / M4 / M7 / M33 supported | ✅ |
Linker-script MEMORY {} auto-detect (with config override) |
✅ |
| Region utilisation report with ASCII bar charts | ✅ |
.data double-counted (flash LMA + RAM VMA) |
✅ |
| Per-section breakdown | ✅ |
| Top-N symbol table (per region) | ✅ |
Per-source-file aggregation via DWARF (addr2line) |
✅ |
| Pre-allocated stack & heap detection (symbol + section) | ✅ |
| Diff mode against a baseline ELF | ✅ |
| Multi-mode analyzer (multiple configs in one run) | ✅ |
| GitHub composite action + reusable workflow | ✅ |
| PR comment with stable marker (idempotent update) | ✅ |
--fail-over-flash-pct / --fail-over-ram-pct CI gates |
✅ |
| Machine-readable JSON metrics | ✅ |
🚀 Quickstart
1. Install
pip install cortex-memory-budget
Runtime dependencies: none (Python ≥ 3.11 stdlib only). At analysis time
you need arm-none-eabi-objdump, arm-none-eabi-nm, and
arm-none-eabi-addr2line on PATH, or pass --objdump/--nm/--addr2line.
2. Write a config (memory-analysis.json)
{
"top_n_symbols": 20,
"top_n_source_files": 15,
"regions": [
{"name": "FLASH", "length_kb": 1024},
{"name": "SRAM", "length_kb": 192}
]
}
regions is optional — if omitted (or for regions not listed), values are
taken from the linker script passed via --linker-script. See
docs/config-schema.md for the full schema.
3. Run
cortex-memory-budget memory-analysis.json \
--elf build/firmware.elf \
--target nucleo-h743zi \
--build-config Release \
--cortex m7 \
--linker-script firmware.ld \
--output-dir reports
Outputs in reports/:
| File | Purpose |
|---|---|
memory_report.md |
Full Markdown report (regions / sections / symbols / src) |
pr_comment.md |
Compact PR comment (with idempotent marker) |
memory_metrics.json |
Machine-readable summary for downstream tooling |
memory_diff.md |
(When --baseline-elf given) per-symbol/section delta |
4. Use in GitHub Actions
- uses: embedded-pro/cortex-memory-budget@v0
with:
config-path: memory-analysis.json
elf-path: build/firmware.elf
baseline-elf-path: baseline/firmware.elf # optional, enables diff
target: nucleo-h743zi
build-config: Release
cortex: m7
linker-script-path: firmware.ld
fail-over-flash-pct: 85
fail-over-ram-pct: 80
The action posts an idempotent PR comment, appends a step summary, and uploads all reports as an artifact. See docs/usage.md for the full input/output reference.
📚 Documentation
| Document | What it covers |
|---|---|
| docs/usage.md | CLI flags, action inputs/outputs, examples |
| docs/config-schema.md | Full JSON config schema + reference |
| docs/memory-model.md | What counts where (.data, COMMON, debug) |
| docs/linker-script-detection.md | Linker-script parser scope & limits |
| docs/cortex-variants.md | M0 / M4 / M7 / M33 notes for memory layout |
| docs/architecture.md | Internal module layout & data flow |
| docs/troubleshooting.md | Common errors & their fixes |
| CONTRIBUTING.md | Dev setup, testing, release process |
| CHANGELOG.md | Version history |
🧪 Examples
Five runnable examples ship in examples/:
| Example | Highlights |
|---|---|
| examples/minimal | Single-region M4 firmware with explicit budgets |
| examples/cortex-m7 | Multi-region layout incl. AXI SRAM |
| examples/cortex-m33 | Single binary spanning two RAM regions |
| examples/multi-mode | One ELF analysed against two budget profiles |
| examples/diff-mode | baseline.elf vs. current.elf growth report |
⚠️ Scope & limitations
This tool gives static post-link footprint analysis. It does not model:
- Worst-case dynamic stack depth (use
-fstack-usage+ a call-graph walker for that). We report only the pre-allocated stack reservation. - Runtime heap fragmentation. We report only the configured heap budget.
- Cache line / row paddings inserted at runtime.
- Externally loaded / overlay / XIP-from-PSRAM code that isn't part of the ELF.
Estimates are intended as a CI guardrail for the static link image.
📄 License
Apache-2.0 — see LICENSE.
Metadata
Release files for cortex-memory-budget 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cortex_memory_budget-0.2.0.tar.gz | 32.3 kB | With provenance | Details for cortex_memory_budget-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cortex_memory_budget-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for cortex_memory_budget-0.2.0-py3-none-any.whl |
Total release size: 63.0 kB
Release files / cortex_memory_budget-0.2.0.tar.gz
| Download URL | cortex_memory_budget-0.2.0.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0214ce792ecea682d69b04f16b28bca61832b246adcee61ea1a6d529cf2776f6
|
|
BLAKE2b-256 checksum How to use checksums |
756d0d981022acd4173b8c1d1b6847dbb39e9cb947cd55577e42e5bd77e6854f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 24, 2026.
Transparency logRelease files / cortex_memory_budget-0.2.0-py3-none-any.whl
| Download URL | cortex_memory_budget-0.2.0-py3-none-any.whl |
|---|---|
| Size | 30.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a4d49a59689017b559114ee48116e5be85cb1d0c6f1af976ae8294e4b21689c9
|
|
BLAKE2b-256 checksum How to use checksums |
d98091840009f5fbe825372893377614dfb940739cc64a420fbafb2c7990a460
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 24, 2026.
Transparency logSecurity for cortex-memory-budget 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for cortex_memory_budget-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.