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

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить
LEVV2006
Грызет канифоль
Сообщения: 286
Зарегистрирован: Сб фев 06, 2010 20:39:59

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

Сообщение LEVV2006 »

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

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

Сейчас SIM800L записывает только в структуру и в момент записи происходит с флагом portENTER_CRITICAL. Чтение происходит без ограничений.

Просто в моей выделяется 3 направления по задачам. Это СМС на модели SIM800L, WEB интерфейс и операционная деятельность со входами/выходами/датчиками.
И всем трем задачам нужен доступ к структуре и к файловой системе.
Как быть????? :dont_know:
Данных много. И в очереди их не запихнешь.
Реклама
Аватара пользователя
ART_ME
Друг Кота
Сообщения: 3011
Зарегистрирован: Вс окт 02, 2016 07:34:45

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

Сообщение ART_ME »

Вам наверное лучше сюда: https://esp8266.ru/forum/
Там только есть проблема - графоман завелся, но люди адекватные и грамотные на форуме есть, и вполне возможно, что успеете толковый ответ получить пока этот графоман Ваше сообщение не обнаружил. 8)
Реклама
LEVV2006
Грызет канифоль
Сообщения: 286
Зарегистрирован: Сб фев 06, 2010 20:39:59

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

Сообщение LEVV2006 »

Спасибо! На форуме помогли!

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

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

Вернуться в «Arduino»