Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

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

Чт мар 23, 2023 13:16:36

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

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

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

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

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

Чт мар 23, 2023 18:23:19

Вам наверное лучше сюда: https://esp8266.ru/forum/
Там только есть проблема - графоман завелся, но люди адекватные и грамотные на форуме есть, и вполне возможно, что успеете толковый ответ получить пока этот графоман Ваше сообщение не обнаружил. 8)

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

Чт мар 23, 2023 21:03:17

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

Оставлю здесь для истории.
Поможет 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) полезны если действия небольшие. (например присвоение переменной значение). Но большие секции отбирают слишком много времени и тогда система падает в ошибку.
Ответить