Claude
Chat app · Skill upload
In Claude, open Customize → Skills and use Create skill to upload the ZIP. Skill availability depends on your plan and workspace settings.
Official Claude setup →Community skill · Free instruction package
Senior embedded software engineer specializing in firmware and driver development for ARM Cortex-M microcontrollers (Teensy, STM32, nRF52, SAMD). Decades of experience writing reliable, optimized, and maintainable embedded code with deep expertise in memory barriers, DMA/cache coherency, interrupt-driven I/O, and peripheral drivers.
Community instruction package. Read the full workflow below, then choose your app in the setup guide. Package instructions and compatibility claims have not been individually verified; check dependencies and license before use.
CHOOSE YOUR AI APP
Choose your app below for setup instructions. Keep the complete downloaded folder together. Each package may need tools, dependencies or permissions that your app does not provide.
Chat app · Skill upload
In Claude, open Customize → Skills and use Create skill to upload the ZIP. Skill availability depends on your plan and workspace settings.
Official Claude setup →Chat app · Access varies
Where Skills is available, open Plugins → Skills → Create → Upload from your computer. Otherwise, copy the instructions into a chat and add your brief; this does not install a skill or include its supporting files.
Official ChatGPT setup →Agent · Project skills
Extract the complete skill folder into your project’s .agents/skills directory. Ask the agent to use the skill for your task.
.agents/skills/arm-cortex-expert/SKILL.mdOfficial Google Antigravity setup →Code editor · Project skills
Extract the complete folder into .cursor/skills. Check the editor’s skill settings and ask the agent to use it.
.cursor/skills/arm-cortex-expert/SKILL.mdOfficial Cursor setup →Coding agent · Project skills
Extract the complete folder into .claude/skills. Ask Claude to use the named skill, or use its slash command when available.
.claude/skills/arm-cortex-expert/SKILL.mdOfficial Claude Code setup →For text-only workflows, you can also paste the instructions into an AI conversation. Copying text does not enable scripts, connect accounts or grant tool access. App subscriptions may cost extra. Logos identify the products; KuchhBhi is independent and is not endorsed by these companies.
resources/implementation-playbook.md.Target Platforms
Core Competencies
Advanced Topics
CRITICAL: ARM Cortex-M7 has weakly-ordered memory. The CPU and hardware can reorder register reads/writes relative to other operations.
Symptoms of Missing Barriers:
C/C++: Wrap register access with __DMB() (data memory barrier) before/after reads, __DSB() (data synchronization barrier) after writes. Create helper functions: mmio_read(), mmio_write(), mmio_modify().
Rust: Use cortex_m::asm::dmb() and cortex_m::asm::dsb() around volatile reads/writes. Create macros like safe_read_reg!(), safe_write_reg!(), safe_modify_reg!() that wrap HAL register access.
Why This Matters: M7 reorders memory operations for performance. Without barriers, register writes may not complete before next instruction, or reads return stale cached values.
CRITICAL: ARM Cortex-M7 devices (Teensy 4.x, STM32 F7/H7) have data caches. DMA and CPU can see different data without cache maintenance.
Alignment Requirements (CRITICAL):
Memory Placement Strategies (Best to Worst):
DTCM/SRAM (Non-cacheable, fastest CPU access)
__attribute__((section(".dtcm.bss"))) __attribute__((aligned(32))) static uint8_t buffer[512];#[link_section = ".dtcm"] #[repr(C, align(32))] static mut BUFFER: [u8; 512] = [0; 512];MPU-configured Non-cacheable regions - Configure OCRAM/SRAM regions as non-cacheable via MPU
Cache Maintenance (Last resort - slowest)
arm_dcache_flush_delete() or cortex_m::cache::clean_dcache_by_range()arm_dcache_delete() or cortex_m::cache::invalidate_dcache_by_range()Best practice: Validate MMIO addresses in debug builds using is_valid_mmio_address(addr) checking addr is within valid peripheral ranges (e.g., 0x40000000-0x4FFFFFFF for peripherals, 0xE0000000-0xE00FFFFF for ARM Cortex-M system peripherals). Use #ifdef DEBUG guards and halt on invalid addresses.
Many status registers (especially i.MX RT, STM32) clear by writing 1, not 0:
uint32_t status = mmio_read(&USB1_USBSTS);
mmio_write(&USB1_USBSTS, status); // Write bits back to clear them
Common W1C: USBSTS, PORTSC, CCM status. Wrong: status &= ~bit does nothing on W1C registers.
⚠️ Voltage Tolerances:
Teensy 4.x: FlexSPI dedicated to Flash/PSRAM only • EEPROM emulated (limit writes <10Hz) • LPSPI max 30MHz • Never change CCM clocks while peripherals active
STM32 F7/H7: Clock domain config per peripheral • Fixed DMA stream/channel assignments • GPIO speed affects slew rate/power
nRF52: SAADC needs calibration after power-on • GPIOTE limited (8 channels) • Radio shares priority levels
SAMD: SERCOM needs careful pin muxing • GCLK routing critical • Limited DMA on M0+ variants
static mutCORRECT Patterns:
static READY: AtomicBool = AtomicBool::new(false);
static STATE: Mutex<RefCell<Option<T>>> = Mutex::new(RefCell::new(None));
// Access: critical_section::with(|cs| STATE.borrow_ref_mut(cs))
WRONG: static mut is undefined behavior (data races).
Atomic Ordering: Relaxed (CPU-only) • Acquire/Release (shared state) • AcqRel (CAS) • SeqCst (rarely needed)
Platform-Specific Priority Levels:
Key Principles:
Configuration:
NVIC_SetPriority(IRQn, priority) or HAL_NVIC_SetPriority()NVIC::set_priority() or use PAC-specific functionsPurpose: Protect shared data from concurrent access by ISRs and main code.
C/C++:
__disable_irq(); /* critical section */ __enable_irq(); // Blocks all
// M3/M4/M7: Mask only lower-priority interrupts
uint32_t basepri = __get_BASEPRI();
__set_BASEPRI(priority_threshold << (8 - __NVIC_PRIO_BITS));
/* critical section */
__set_BASEPRI(basepri);
Rust: cortex_m::interrupt::free(|cs| { /* use cs token */ })
Best Practices:
Common Causes:
Inspection Pattern (M3/M4/M7):
HFSR (HardFault Status Register) for fault typeCFSR (Configurable Fault Status Register) for detailed causeMMFAR / BFAR for faulting address (if valid)R0-R3, R12, LR, PC, xPSRPlatform Limitations:
Debug Tip: Use hardfault handler to capture stack frame and print/log registers before reset.
| Feature | M0/M0+ | M3 | M4/M4F | M7/M7F | | ------------------ | ------------------------ | -------- | --------------------- | -------------------- | | Max Clock | ~50 MHz | ~100 MHz | ~180 MHz | ~600 MHz | | ISA | Thumb-1 only | Thumb-2 | Thumb-2 + DSP | Thumb-2 + DSP | | MPU | M0+ optional | Optional | Optional | Optional | | FPU | No | No | M4F: single precision | M7F: single + double | | Cache | No | No | No | I-cache + D-cache | | TCM | No | No | No | ITCM + DTCM | | DWT | No | Yes | Yes | Yes | | Fault Handling | Limited (HardFault only) | Full | Full | Full |
Lazy Stacking (Default on M4F/M7F): FPU context (S0-S15, FPSCR) saved only if ISR uses FPU. Reduces latency for non-FPU ISRs but creates variable timing.
Disable for deterministic latency: Configure FPU->FPCCR (clear LSPEN bit) in hard real-time systems or when ISRs always use FPU.
MPU Guard Pages (Best): Configure no-access MPU region below stack. Triggers MemManage fault on M3/M4/M7. Limited on M0/M0+.
Canary Values (Portable): Magic value (e.g., 0xDEADBEEF) at stack bottom, check periodically.
Watchdog: Indirect detection via timeout, provides recovery. Best: MPU guard pages, else canary + watchdog.
Pattern: Create non-blocking SPI drivers with transaction-based read/write:
sensorReadRegister(0x0F) for WHO_AM_IPlatform-specific APIs:
SPI.beginTransaction(SPISettings(speed, order, mode)) → SPI.transfer(data) → SPI.endTransaction()HAL_SPI_Transmit() / HAL_SPI_Receive() or LL driversnrfx_spi_xfer() or nrf_drv_spi_transfer()SERCOM_SPI_MODE_MASTERThe instruction package is free to download. Your AI app, model usage, connected services and third-party assets may have separate costs.
It is a set of instructions for a compatible AI assistant. It does not run by itself, connect accounts or install an MCP server.
Check that the named folder contains SKILL.md directly, not a second nested ZIP folder. Confirm that your editor supports skills and that its current settings allow this location. See the official documentation below.