Skip to main content

Static flash/RAM footprint analysis for ARM Cortex-M binaries (M0/M4/M7/M33)

Project description

cortex-memory-budget

CI PyPI Python License

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cortex_memory_budget-0.2.0.tar.gz (32.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cortex_memory_budget-0.2.0-py3-none-any.whl (30.7 kB view details)

Uploaded Python 3

File details

Details for the file cortex_memory_budget-0.2.0.tar.gz.

File metadata

  • Download URL: cortex_memory_budget-0.2.0.tar.gz
  • Upload date:
  • Size: 32.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for cortex_memory_budget-0.2.0.tar.gz
Algorithm Hash digest
SHA256 0214ce792ecea682d69b04f16b28bca61832b246adcee61ea1a6d529cf2776f6
MD5 dcd64af1ba9ce6ae5911db8916c0835d
BLAKE2b-256 756d0d981022acd4173b8c1d1b6847dbb39e9cb947cd55577e42e5bd77e6854f

See more details on using hashes here.

Provenance

The following attestation bundles were made for cortex_memory_budget-0.2.0.tar.gz:

Publisher: release.yml on embedded-pro/cortex-memory-budget

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file cortex_memory_budget-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for cortex_memory_budget-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a4d49a59689017b559114ee48116e5be85cb1d0c6f1af976ae8294e4b21689c9
MD5 cb41e57ae474cd3aa9990308c87f79dd
BLAKE2b-256 d98091840009f5fbe825372893377614dfb940739cc64a420fbafb2c7990a460

See more details on using hashes here.

Provenance

The following attestation bundles were made for cortex_memory_budget-0.2.0-py3-none-any.whl:

Publisher: release.yml on embedded-pro/cortex-memory-budget

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page