• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32+FreeRTOS+Массив данных и SPIFFS

Levvarrr

New member
Всем привет!
В проекте решил применить FreeRTOS и вот возникли вопросы по работе с данными.
О структуре проекта:
Изначально проект линейный и я не использовал FreeRTOS. Но когда подключил модуль SIM800L с его адскими задержками ответов, то понял что без FreeRTOS мне не обойтись. Для SIM800L была создана задача и проблема с задержками ответов решилась. Но встал в вопрос по доступу к данным.
Данные:
Есть 2 структуры (обе в оперативной памяти). В одной хранится настройки всего проекта в другой текущие данные статусов и показания датчиков.
Настройки также сохраняются в файловой системе в JSON формате. (Это удобно так как у устройства есть WEB интерфейс).

И теперь вопрос. Как правильно читать и записывать данные в структуру и в файловую систему из разных задач?

Сейчас SIM800L записывает только в структуру и в момент записи происходит с флагом portENTER_CRITICAL. Чтение происходит без ограничений.
И если я читаю из SPIFFS с флагом portENTER_CRITICAL. То контроллер сваливается в ошибку: Guru Meditation Error: Core 0 panic'ed (Interrupt wdt timeout on CPU0).

Просто в моей выделяется 3 направления по задачам. Это СМС на модели SIM800L, WEB интерфейс и операционная деятельность со входами/выходами/датчиками.
И всем трем задачам нужен доступ к структуре и к файловой системе.
Как быть?????
Данных много. И в очереди их не запихнешь.
 

Levvarrr

New member
Работает!
Большое спасибо!

Для себя и истории.
SemaphoreHandle_t mutex_v; //Объявляем глобальную переменную
mutex_v = xSemaphoreCreateMutex(); //В блоке setup создаем Mutex.
И используем в задачах
xSemaphoreTake(mutex_v, portMAX_DELAY); //Берем Mutex
Код с доступом к ресурсу //Здесь производим действия над ресурсом
xSemaphoreGive(mutex_v); //Возвращаем Mutex

Mutex ограничивает доступ к ресурсу. При этом не тормозит общее время и тем самым не вызывает ошибок.
Критические секции (portENTER_CRITICAL) полезны если действия небольшие. (например присвоение переменной значение). Но большие секции отбирают слишком много времени и тогда система падает в ошибку.
 
Сверху Снизу