fix: Flash-Lock im SDK, Store-Lock, Flush vor Reboot

This commit is contained in:
Michael Sauer
2026-09-11 22:10:28 +02:00
parent dce9ad2946
commit 0648b3a252
5 changed files with 82 additions and 7 deletions
+55 -6
View File
@@ -20,6 +20,7 @@
#define NL_APP_PRIO 40
static tls_os_mutex_t *s_lock;
static tls_os_mutex_t *s_store_lock; /* serialises all nl_settings_* / nl_state_log_* / nl_resetcnt_* calls */
static nl_settings_t s_settings;
static volatile uint32_t s_light_beat;
static volatile bool s_factory_reset_requested;
@@ -29,6 +30,9 @@ static u32 s_light_stack[512];
void nl_app_lock(void) { tls_os_mutex_acquire(s_lock, 0); }
void nl_app_unlock(void) { tls_os_mutex_release(s_lock); }
static void store_lock(void) { tls_os_mutex_acquire(s_store_lock, 0); }
static void store_unlock(void) { tls_os_mutex_release(s_store_lock); }
uint32_t nl_app_now_ms(void)
{
return (uint32_t)((uint64_t)tls_os_get_time() * 1000u / HZ);
@@ -38,13 +42,41 @@ nl_settings_t *nl_app_settings(void) { return &s_settings; }
int nl_app_save_settings(void)
{
static nl_settings_t copy; /* guarded by the store lock */
int r;
store_lock();
nl_app_lock();
r = nl_settings_save(&s_settings);
copy = s_settings;
nl_app_unlock();
r = nl_settings_save(&copy);
store_unlock();
return r;
}
void nl_app_flush(void)
{
nl_light_state_t st;
store_lock();
nl_app_lock();
nl_ctrl_get(&st);
nl_app_unlock();
if (nl_state_log_append(&st) == 0) { /* no write when unchanged */
nl_app_lock();
nl_ctrl_persisted(&st);
nl_app_unlock();
}
store_unlock();
}
void nl_app_reboot(void)
{
printf("reboot\r\n");
nl_app_flush();
tls_sys_reset();
}
void nl_app_request_factory_reset(void) { s_factory_reset_requested = true; }
void nl_app_factory_reset(void)
@@ -54,9 +86,11 @@ void nl_app_factory_reset(void)
nl_engine_blink(3);
nl_app_unlock();
tls_os_time_delay(2 * HZ); /* 3 blinks = 1.8 s, the light task keeps running */
store_lock();
nl_settings_erase();
nl_state_log_erase();
nl_resetcnt_clear();
store_unlock();
tls_sys_reset();
}
@@ -95,12 +129,14 @@ static void app_task(void *arg)
(void)arg;
nl_flash_init();
nl_led_init(board); /* hardware init first (spec 3.4): LEDs dark before any flash/state scan */
store_lock();
nl_resetcnt_init(base + NL_FL_RESETCNT);
boots = nl_resetcnt_boot();
nl_settings_init(base + NL_FL_SETTINGS_A, base + NL_FL_SETTINGS_B);
nl_settings_load(&s_settings);
nl_state_log_init(base + NL_FL_STATE_0, base + NL_FL_STATE_1);
have_last = nl_state_log_load(&last);
store_unlock();
printf("boot #%u, settings: pob=%u fade=%u/%u, last state: %s\r\n", boots,
s_settings.power_on_behaviour, s_settings.fade_in_ms, s_settings.fade_out_ms,
have_last ? "yes" : "no");
@@ -133,8 +169,11 @@ static void app_task(void *arg)
tls_os_time_delay(HZ / 10); /* 100 ms */
now = nl_app_now_ms();
if (!counter_cleared && now - boot_ms >= NL_RESETCNT_CLEAR_MS)
if (!counter_cleared && now - boot_ms >= NL_RESETCNT_CLEAR_MS) {
store_lock();
counter_cleared = nl_resetcnt_clear() == 0;
store_unlock();
}
if (s_factory_reset_requested)
nl_app_factory_reset(); /* does not return */
@@ -142,10 +181,16 @@ static void app_task(void *arg)
nl_app_lock();
due = nl_ctrl_persist_due(now, &pending);
nl_app_unlock();
if (due && nl_state_log_append(&pending) == 0) {
nl_app_lock();
nl_ctrl_persisted(&pending);
nl_app_unlock();
if (due) {
int r;
store_lock();
r = nl_state_log_append(&pending);
store_unlock();
if (r == 0) {
nl_app_lock();
nl_ctrl_persisted(&pending);
nl_app_unlock();
}
}
if (s_light_beat != beat_seen) {
@@ -166,5 +211,9 @@ void UserMain(void)
printf("FATAL: cannot create app lock\r\n");
return;
}
if (tls_os_mutex_create(0, &s_store_lock) != TLS_OS_SUCCESS) {
printf("FATAL: cannot create store lock\r\n");
return;
}
tls_os_task_create(NULL, "nl_app", app_task, NULL, (u8 *)s_app_stack, sizeof(s_app_stack), NL_APP_PRIO, 0);
}