fix(mcu): volatile emergency state + AGC holdoff zero-guard (closes #83)
Bug 1 (main.cpp:630): system_emergency_state lacked volatile. Under -O1+ the compiler is permitted to hoist the read outside the blink loop, making while (system_emergency_state) unconditionally infinite. Once entered, the only escape was the 4 s IWDG timeout — which resets the MCU and re-energizes the PA rails that Emergency_Stop() explicitly cut. Marking the variable volatile forces a memory read on every iteration so an external clear (ISR, USB command, manual reset) can break the loop correctly. Bug 2 (ADAR1000_AGC.cpp:59): holdoff_frames is a public uint8_t; if a caller sets it to 0, the condition holdoff_counter >= holdoff_frames is always true (any uint8_t >= 0), causing the AGC outer loop to increase gain on every non-saturated frame with no holdoff delay. With alternating sat/no-sat frames this produces a ±step oscillation that prevents the receiver from settling. Fix: clamp holdoff_frames to a minimum of 1 in the constructor, preserving all existing test assertions (none use 0; default remains 4). Reported-by: shaun0927 (Junghwan) <https://github.com/shaun0927>
This commit is contained in:
@@ -24,6 +24,7 @@ ADAR1000_AGC::ADAR1000_AGC()
|
|||||||
, saturation_event_count(0)
|
, saturation_event_count(0)
|
||||||
{
|
{
|
||||||
memset(cal_offset, 0, sizeof(cal_offset));
|
memset(cal_offset, 0, sizeof(cal_offset));
|
||||||
|
if (holdoff_frames == 0) holdoff_frames = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -627,7 +627,7 @@ typedef enum {
|
|||||||
|
|
||||||
static SystemError_t last_error = ERROR_NONE;
|
static SystemError_t last_error = ERROR_NONE;
|
||||||
static uint32_t error_count = 0;
|
static uint32_t error_count = 0;
|
||||||
static bool system_emergency_state = false;
|
static volatile bool system_emergency_state = false;
|
||||||
|
|
||||||
// Error handler function
|
// Error handler function
|
||||||
SystemError_t checkSystemHealth(void) {
|
SystemError_t checkSystemHealth(void) {
|
||||||
|
|||||||
Reference in New Issue
Block a user