Jonathan BennettandClaude Opus 5.5 51972a652b Serialise the two chip reads that were issued outside the radio-sequence lock
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
2026-10-10 15:25:15 +00:00
2026-10-02 11:59:23 +00:00
2021-10-09 17:15:12 +11:00
2024-09-24 15:24:08 -05:00
2026-10-03 21:22:22 +02:00
2026-07-01 19:01:27 -05:00
2026-01-29 10:06:58 -06:00
2024-11-28 06:26:51 -06:00
2024-09-04 15:33:28 -07:00
2026-01-29 10:06:58 -06:00
2026-01-29 10:06:58 -06:00
2026-10-03 22:43:30 +00:00
2025-01-13 12:24:05 +08:00
2026-01-29 10:06:58 -06:00

Meshtastic Logo

Meshtastic Firmware

GitHub release downloads CI CLA assistant Fiscal Contributors Vercel MemBrowse

meshtastic%2Ffirmware | Trendshift

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

Join our community and help improve Meshtastic! 🚀

Stats

Alt

S
Description
No description provided
Readme GPL-3.0
317 MiB
0 Stars 1 Watchers 0 Forks
Languages
C++ 73.6%
C 21.7%
Python 2.6%
Shell 1.5%
Batchfile 0.2%
Other 0.2%