ble-connection-debugFix Bluetooth Low Energy peripherals that drop, stall or refuse to reconnect. Capture on air (nRF Sniffer into Wireshark) beside the phone's log before reading code. Check connection interval, peripheral latency and supervision timeout against their own constraint (timeout must exceed twice the inte
brick-recoveryRevive an unresponsive board without destroying what cannot be replaced, and make the next one recoverable: classify what is alive first (supply current on a bench supply, clock, ROM-bootloader banner on UART, SWD or JTAG answering), climb from least to most destructive (recovery button combination,
device-clock-handlingGet time right on devices whose clocks drift or wrap: keep two clocks, a monotonic tick since boot that drives every timeout and interval and wall-clock UTC used only for timestamps; stamp records with boot id plus monotonic time and backfill wall time once synced; compare ticks with unsigned subtra
device-telemetry-designDecide what a device reports so field problems stay diagnosable inside a data and battery budget: fix bytes per day per device from plan cost and radio energy, then spend it on a minimum (reset reason and count, uptime, build id, fault record with PC, LR and CFSR, update state, heap and stack waterm
device-trust-anchorsPlan certificate lifetimes, trust roots and clocks for devices that will live a decade: size lifetimes by field life plus shelf life, ship at least two trust anchors (the current one and an offline-held spare) so rotation is a configuration push, pin to a private intermediate rather than a public le
field-failure-triageWork out why deployed units are failing, going silent or coming back, and decide containment: read flash, faults and battery state of a returned unit before reflashing; scope a silent cohort by last-seen (a step at one timestamp points at cloud, certificate, DNS or release, so check broker and auth
fieldbus-debugDebug CAN, RS-485 and Modbus links on machines and sites. CAN: with power off measure CANH to CANL (about 60 ohms means two terminators), match bit rate and sample point on every node, read the transmit and receive error counters, recover from bus-off with backoff, and decode traffic with the DBC fi
firmware-code-reviewReview a change to C or C++ firmware for the defects that kill devices in the field, ordered by lethality: everything an ISR touches (volatile is not atomic, multi-byte reads tear on narrow cores, no blocking, allocation or printf), every hardware wait with a timeout and an exit, tick arithmetic tha
flash-storage-durabilityMake settings and logs kept in flash or EEPROM survive power cuts and wear: classify each datum by write rate and tolerable loss, compute a wear budget (endurance times erasable units over writes per day times erases per write, at least three times product life), never update in place (two slots wit
fleet-provisioningGive every manufactured device its own factory identity and an auditable record. Generate the key pair inside the secure element or crypto block and export only a CSR; never flash a shared key or keep a private key on the line PC. Run a fixed station flow (firmware, reversible readout protection, ke
hard-fault-triageDecode a Cortex-M HardFault or field crash into a source line: archive the ELF and map of every release keyed by build id, capture the stacked R0-R3, R12, LR, PC and xPSR in a handler that picks MSP or PSP from the EXC_RETURN bit, read CFSR, HFSR and MMFAR/BFAR only when their valid bits are set, cl
memory-footprint-budgetKeep firmware inside flash and RAM with headroom for the next update: treat the linker map as the source of truth, diff per-section and per-module sizes against main on every pull request and fail at a budget of about 85 to 90 per cent, derive worst-case stack depth per task from -fstack-usage and t
mqtt-session-debugDiagnose MQTT devices that flap, miss messages or stampede the broker. Check in order: duplicate client ids (two units sharing one id take each other's session over in a loop), keepalive against the shortest NAT or cellular idle timeout (set near half), clean versus persistent session and expiry, Qo
ota-fleet-rolloutRun a staged firmware campaign across devices that check in rarely and cannot be recalled: rings sized as device counts across every hardware revision, carrier and region (lab, staff, 0.1 per cent, 1, 10, 50, 100), bake time counted in check-in intervals of the slowest cohort, halt signals written f
ota-update-safetyDesign or audit the device-side firmware update so a power cut or a bad image never bricks a unit: list every flash write in the update path and cut power at each with a relay harness before shipping, write to the inactive slot, verify hash and signature over the whole image after the last write, fl
rtos-concurrency-huntFind the cause of corruption, deadlock, starvation or lost events in RTOS firmware. Map the symptom to a class: unprotected shared data, a non-ISR-safe call from an interrupt or a stack overflow for corruption; a lock-order cycle, a mutex held across a queue wait or priority inversion through a bina
serial-bus-debugBring up a UART, I2C or SPI link that returns garbage, NACKs or reads all 0xFF: check electrical before logical (power, common ground, logic levels, RS-232 versus TTL), put a logic analyser with a protocol decoder on the wires before changing code, compute UART baud error from the clock divider, sco
sleep-current-huntFind why a battery device draws milliamps asleep or dies in months instead of years, and estimate battery life from a measured trace: measure with a current-ranging power profiler or a shunt and scope, never a bench multimeter, integrate charge over a full cycle, rank slices by charge rather than pe
sleep-wake-bug-huntFix devices that miss wakeups, hang on wake, or lose state after deep sleep: classify first as a lost wakeup (event lands between the flag check and sleep; check with interrupts masked and sleep on WFI), a wake-source fault (wrong edge or level, flag not cleared, instant re-wake loop) or a retention
watchdog-designDesign or fix a watchdog so it recovers real hangs without masking them: feed it from exactly one place, only after every monitored task has checked in with a progress token inside the window, never from an ISR or a lone idle hook, set the timeout from measured worst-case loop time with a 2x to 3x m