• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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) полезны если действия небольшие. (например присвоение переменной значение). Но большие секции отбирают слишком много времени и тогда система падает в ошибку.
 
Сверху Снизу