The radio hard-froze (needs battery pull) the instant it processed an incoming DMR frame — repeater reply, or noise on a DMR channel. FM and DMR TX-without-a- listening-repeater were fine. Cause: codec_interface.c invoked the AMBE codec through hand-written inline assembler with no operands and no clobber list, branching (BL) to an absolute address. That code's correctness depends entirely on a specific compiler's register allocation; modern GNU toolchains (both ARM GCC 10 and 14) miscompile it, corrupting state on the first codec call. Port the official R20260504 (git ebd7100) rework: replace all five inline-asm calls (2x decode, 2x encode, 1x ECC) with C function-pointer calls. Each call reproduces the exact register/stack layout the assembler set up (AAPCS: args 1-4 -> r0-r3, args 5+ -> stack) and sets the Thumb bit on the target address. Also drop the trailing semicolons from the AMBE_* address macros in codec.h so they can be used in C expressions. Builds cleanly with the GCC 14.2 Docker toolchain (no STM32CubeIDE needed) and DMR RX/TX now works on the radio. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| dmr_codec | ||
| functions | ||
| hardware | ||
| interfaces | ||
| io | ||
| usb | ||
| user_interface | ||
| applicationMain.h | ||
| utils.h | ||