mirror of
https://github.com/meshtastic/firmware.git
synced 2026-11-07 23:04:49 -05:00
51972a652bda3b5623629ca6e3a91c532cd7cfa1
canSendImmediately() called isActivelyReceiving() with no lock, and that reads the
chip's IRQ status over SPI in every driver - getIrqFlags() on SX126x, getIrqStatus()
on LR11x0/LR20x0/SX128x, isReceiving() on RF95. LR11x0Interface::stageTxEarly()
likewise wrote the TX payload with WriteBuffer8 unlocked, and onNotify() calls it
before the sequence that wraps the scan and the transmit.
Either command can land in the middle of another task's sequence - the RX readout's,
in practice - leaving the chip mid-command with BUSY asserted. Both tasks then spin
in RadioLib's BUSY wait until its 1000 ms spiConfig.timeout fires, and because the
radio holds exactly one frame, whatever arrives during that second overwrites what is
still sitting in the chip.
Measured on a T1000-E (LR1110) over 300 s sessions, two arms interleaved, 3 runs each:
unlocked both locks
BUSY waits >=20 ms 5-13 0
longest BUSY wait 999-1000 ms 1 ms
1 s radio stalls 5, 11, 13 0, 0, 0
frames decoded by
the chip but never
fetched 7, 16, 18 0, 0, 0
total packet loss 0.59/1.23/1.30% 0.00/0.00/0.07%
Disjoint on all four, each at the exact 3v3 permutation floor (p=0.100); 1.00% mean
loss over eight unlocked runs against 0.02%. No re-inits, recoveries or reboots in
any run. Locking only the IRQ-status read was not enough (p=0.500): it clears one
collision family and leaves the payload write's.
The sequence mutex is recursive, so a caller already holding it re-enters, and
lockRadioSequence() is a no-op off FreeRTOS, so Portduino behaviour is unchanged.
SX126xInterface::stageTxEarly() has the same shape but is gated behind
irqPolledOverUsb(), true only for the single-threaded Portduino CH341 server, so it
cannot collide and is left alone.
Ported from 263aeef66 on claude/dmshell-r100-busy, with the comments trimmed.
Co-Authored-By: Jonathan Bennett <jbennett@incomsystems.biz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01REkPVFh6kvG4AZJ5A8AtM9
Overview
This repository contains the official device firmware for Meshtastic, an open-source LoRa mesh networking project designed for long-range, low-power communication without relying on internet or cellular infrastructure. The firmware supports various hardware platforms, including ESP32, nRF52, RP2040/RP2350, and Linux-based devices.
Meshtastic enables text messaging, location sharing, and telemetry over a decentralized mesh network, making it ideal for outdoor adventures, emergency preparedness, and remote operations.
Get Started
- 🔧 Building Instructions - Learn how to compile the firmware from source.
- ⚡ Flashing Instructions - Install or update the firmware on your device.
Join our community and help improve Meshtastic! 🚀
Stats
Languages
C++
73.6%
C
21.7%
Python
2.6%
Shell
1.5%
Batchfile
0.2%
Other
0.2%
