Releases: PyMCU/pymcu-arm
Release list
v0.1.0a4
Companion release to PyMCU v0.1.0a4.
pymcu flashworks end to end on the Pico / Pico 2: every build now packsdist/firmware.uf2next to the.bin(pure-Python UF2 packer, family IDs verified byte-for-byte against a hardware-proven reference; RP20400xe48bff56, RP2350 ARM-S0xe48bff59).- Correctness: operand-less inline
asm()now clobbers memory — LLVM could previously hoist loads acrosscpsid, silently breaking critical sections; the backend binary codesign is verify-first and flock-serialized. - New
irq-criticalexample + UF2 artifact tests. Suite: 70 tests.
Install: pip install --pre "pymcu-compiler[arm]"
v0.1.0a3.post0
Packaging fix over v0.1.0a3: the RP2040/RP2350 runtime sources (boot2.S, crt0.S, crt0_m33.S, picobin_rp2350.S and the linker scripts) are now bundled inside the wheel — pymcu build for arm targets works from a plain PyPI install (previously they were only present in editable/dev checkouts).
v0.1.0a3 (alpha 3)
pymcu-arm v0.1.0a3 — companion release to PyMCU v0.1.0a3 (third alpha). The ARM targets (RP2040 / RP2350) reach feature parity with AVR.
RP2350 (Pico 2 / Pico 2 W)
- Full target bring-up:
crt0_m33, picobin image block, linker script, RTOS-enabling codegen. - f32 via the M33 FPU (softfp) — native hardware floats.
- CYW43439 WiFi bring-up + MQTT examples and integration tests.
RP2040 (Pico / Pico W)
- f32 via the bootrom fast-float library — floats without an FPU.
- Integer division through the SIO hardware divider, now IRQ-safe (PRIMASK guard).
ArrayStore/ArrayLoad/ArrayBase+bytearraylowering; function-local and imported-module fixed arrays.
Both targets
- Portable T-flag exception model —
try/except/raisenow works on ARM (SignalError/SignalSuccess/BranchOnError). - Flash-resident const tables (
FlashData/ArrayLoadFlash/FlashLoadPtr/FlashStrAddr). - Inline
asm()with operands (textual constraints=r/0). - End-to-end examples for the a3 language features: generators, async v2 (
gather, return values), f-strings as values, dict/set literals,FixedDict, inferreddeftypes, slice assignment,print(float).
60/60 integration tests green on the RP2040Sharp / RP2350Sharp emulators.
Install: pip install --pre "pymcu-compiler[arm]"
v0.1.0a1.post1
pymcu-arm 0.1.0a1.post1
What's new
Windows compatibility
- Fix LLVM search dirs on Windows: use
%APPDATA%,%LOCALAPPDATA%,%PROGRAMFILES%paths - Pin subprocess encoding to UTF-8
- Add
win-arm64wheel target to CI matrix (WoA x64 emulation)
Housekeeping
- Add
.gitignore; remove committed__pycache__entries - Add MIT LICENSE file
Install
pip install --pre pymcu-arm
Pre-Release v0.1.0a1.post0
pymcu-arm 0.1.0a1.post0
What's new
RP2040 flasher — pymcu flash now works for Raspberry Pi Pico targets.
Rp2040Programmer is registered under the pymcu.programmers entry-point and uses two strategies in order:
- picotool — if found on system PATH (
brew install picotool/apt install picotool). Runspicotool load -f firmware.uf2 && picotool reboot. - UF2 drag-and-drop — no extra tools required. Hold BOOTSEL while plugging in USB; the board mounts as
RPI-RP2. PyMCU finds the volume automatically on macOS, Linux, and Windows and copies the.uf2. Waits up to 10 s for the board to appear.
Installation
pip install --pre "pymcu-arm==0.1.0a1.post0"Or via the compiler:
pip install --pre "pymcu-compiler[arm]"Pre-Release v0.1.0a1
pymcu-arm 0.1.0a1 — Pre-Release
First public pre-release of pymcu-arm, the ARM (Cortex-M) backend for the
PyMCU compiler.
This release was formerly distributed as pymcu-rp2040. The package has been
renamed to reflect its scope: the backend targets the ARM Cortex-M architecture,
with the RP2040 as the first supported chip.
What's included
| Component | Description |
|---|---|
pymcuc-arm |
AOT-compiled .NET 10 binary — lowers PyMCU IR to LLVM IR |
Rp2040BackendPlugin |
Backend entry-point registered under pymcu.backends → rp2040 |
Rp2040ToolchainPlugin |
Toolchain driver registered under pymcu.toolchains → rp2040 |
Rp2040LlvmToolchain |
Resolves opt, llc, llvm-mc, ld.lld, llvm-objcopy via pymcu-arm-toolchain or system LLVM |
Supported targets
| Chip | Triple | CPU | Status |
|---|---|---|---|
| RP2040 (Raspberry Pi Pico) | thumbv6m-none-eabi |
cortex-m0plus |
✅ |
Compilation pipeline
PyMCU source (.py)
→ pymcuc (frontend + IR)
→ pymcuc-arm (LLVM IR)
→ opt (LLVM optimiser, -O2)
→ llc (LLVM → ARM Thumb2 assembly)
→ llvm-mc (assembly → ELF object)
→ ld.lld (linker → ELF)
→ llvm-objcopy (ELF → flat binary / UF2)
Installation
pip install pymcu-arm==0.1.0a1pymcu-arm-toolchain (LLVM 22.1.7) is declared as a platform-gated dependency
and is pulled in automatically on supported platforms (linux-x64, linux-arm64,
macos-arm64, windows-x64). On first use the toolchain stub auto-downloads the
LLVM binaries (~300 MB) into ~/.pymcu/tools/.
# Verify the toolchain resolved correctly
python -m pymcu_arm_toolchain statusLanguage features (RP2040)
- Blink / GPIO —
machine.Pinoutput, toggle, value read - UART —
machine.UARTtransmit and echo - MicroPython compatibility layer —
pymcu-micropythonstub mapped tomachine.* - CircuitPython compatibility layer —
pymcu-circuitpythonstub mapped todigitalio.*/busio.UART - Function pruning — unreachable functions stripped from codegen output
- Concurrent build safety —
Lazy<T>compiler guard prevents OOM under parallel test runs
Test status
6 integration tests pass against the RP2040Sharp simulator (blink + UART echo, both MicroPython and CircuitPython compat layers).
Known limitations
- Alpha quality — API and IR format may change between pre-releases.
- Only the RP2040 target is currently exercised; other Cortex-M0+ chips may
work but are untested. - The
pymcuc-armbinary is built per-platform at release time; wheels are
published to GitHub Releases (too large for PyPI).
What changed from pymcu-rp2040
- Package renamed
pymcu-rp2040→pymcu-arm - Python module remains at
pymcu.backend.rp2040/pymcu.toolchain.rp2040
(chip-level paths are stable). - Binary renamed
pymcuc-rp2040→pymcuc-arm - Toolchain dependency renamed
pymcu-rp2040-toolchain→pymcu-arm-toolchain
(LLVM 22.1.7, now wired as a runtime dependency) - CI migrated from a private Docker runner to GitHub-hosted runners
- Publish workflow uses OIDC trusted publishing (no stored PyPI token)