From 82106105b77b58bc90e97556b97b11351ebb5c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beat=20K=C3=BCng?= Date: Wed, 25 Sep 2019 10:58:19 +0200 Subject: [PATCH] parameters: defer auto-saving to after disarming for flash-based params This is especially important for DShot, that does not update when the CPU stalls. --- src/lib/parameters/parameters.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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;