diff --git a/src/lib/parameters/parameters.cpp b/src/lib/parameters/parameters.cpp index 5b613db78b..1be858bf2c 100644 --- a/src/lib/parameters/parameters.cpp +++ b/src/lib/parameters/parameters.cpp @@ -66,6 +66,8 @@ using namespace time_literals; #if !defined(PARAM_NO_ORB) # include "uORB/uORB.h" # include "uORB/topics/parameter_update.h" +# include +# include #endif #if defined(FLASH_BASED_PARAMS) @@ -614,6 +616,21 @@ autosave_worker(void *arg) { bool disabled = false; +#if !defined(PARAM_NO_ORB) + + if (!param_get_default_file()) { + // In case we save to FLASH, defer param writes until disarmed, + // as writing to FLASH can stall the entire CPU (in rare cases around 300ms on STM32F7) + uORB::SubscriptionData armed_sub{ORB_ID(actuator_armed)}; + + if (armed_sub.get().armed) { + work_queue(LPWORK, &autosave_work, (worker_t)&autosave_worker, nullptr, USEC2TICK(1_s)); + return; + } + } + +#endif + param_lock_writer(); last_autosave_timestamp = hrt_absolute_time(); autosave_scheduled = false;