Troubleshooting
Common failures when running LabWired. Fix the twin or the firmware — do not ignore a red result.
Simulation
Memory violation (MemoryAccessViolation / MemoryViolation)
Meaning: firmware touched an address with no flash, RAM, or modeled peripheral.
Do:
- Check flash/RAM in
configs/chips/<chip>.yaml - Check missing peripherals in the chip or system YAML
- Align the firmware linker script with the chip map
- See the board ✅ / ⚠️ / ❌ matrix — you may have hit a stub
Decode / illegal instruction
Meaning: CPU executed invalid opcodes (often bad entry point).
Do:
- Check the vector table / reset handler
- Confirm the firmware loaded (try
labwired runwith a known-good example) - On Cortex-M, Thumb entry addresses are odd (LSB = 1)
Empty or missing serial
Meaning: firmware never wrote the UART you are watching, or wiring is wrong.
Do:
- Match UART instance and pins to the system YAML
- Confirm clocks enabled the UART block
- Read
uart.logfromlabwired testoutput dir
Max steps / no progress
Meaning: simulation hit the step budget or a tight infinite loop.
Do:
- Raise
max_stepsin the test script if boot is long - Find the loop with
--trace - Fix firmware waits that never complete on the twin (PLL, flags on unmodeled bits)
DAP / GDB connection refused
Do:
- Start LabWired with GDB enabled as in GDB integration
- Match the port in your debugger config (often
3333)
CI
| Symptom | Fix |
|---|---|
| Different result locally vs CI | Pin the same LABWIRED_VERSION / action version |
| Action cannot download CLI | Check release tag and network; pin a known-good version |
| JUnit missing | Pass --junit / action output-dir and upload artifacts if: always() |
See CI integration.
Parts and diagrams
| Symptom | Fix |
|---|---|
| Device not found | Type id must match configs/devices/ / catalog; labwired_describe |
| I²C NACK forever | Address, bus id, and wiring; WHO_AM_I first |
| Agent invents pins | Force labwired_describe before wire |
See Onboard a part.