Пробую разобраться с FreeRtos. В задаче lcdTask при выполнении строки tft.fillScreen(TFT_BLACK); программа виснет. Как мне кажется, в tft.fillScreen могут использоваться прерывания и прямой доступ к памяти, из-за этого задача виснет, возможно планировщик в момент работы tft.fillScreen начинает переключать задачу на loop. Критическая секция vPortEnterCritical(&m) помогает, зависать перестает, как правильно поступают в таких случаях? Возможно мои выводы не верны. Хочется разобраться с этим вопросом. Первая программа с использованием FreeRtos и такие грабли.
Можете объяснить почему эта задача зависает?
Еще раз повторюсь, если в задаче FreeRtos вызываются функции использующие аппаратные ресурсы, например DMA, то как пишется задача FreeRtos? Пока предполагаем что только в одной задаче используется доступ к SPI с использованием DMA.
Enter critical и exit critical - макросы при правильном проектировании приложения почти никогда не нужны. Ибо обращаться к ресурсам из разных потоков - лучший способ выстрела себе в ногу! Честно. Многозадачная ОС имеет свои особенности.
th 1
E (32397) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (32397) task_wdt: - IDLE (CPU 0)
E (32397) task_wdt: Tasks currently running:
E (32397) task_wdt: CPU 0: Lcd
E (32397) task_wdt: CPU 1: loopTask
E (32397) task_wdt: Aborting.
abort() was called at PC 0x400db671 on core 0
Backtrace: 0x40083435:0x3ffbe9dc |<-CORRUPTED
Кстати, у меня какое-то фантомное воспоминание о том, что в idle piority task с wdt попроще как-то. Хотя, я программингом не занимаюсь с утра до вечера - могу и путать.
Не могёт иметь место быть!
В ЕСП32 луп исполняется с Айдл приорити в точно таком же потоке. Новый от лупа не отличается даже с лупой, Прости за “калом бур”.
Если библиотека вообще умеет “в ЕСП32”, то и так тоже сумеет.
Если ёрничать перестать, то у ТС есть огрехи, но не в этом. Может сегодня, когда (если) встану и позавтракаю, то напишу Трактат о принципах работы с FreeRTOS. Коротенько, минут на сорок.
Я вижу, что таску он не с tskIDLE_PRIORITY запускает, и потом у её внутри вачдог начинает возбуждаться. Если он делеев напихал, то единственный затык - это функция неизвестной библиотеки.
По мне так выходит.
Успевает выполнится, до переключения контекста. Задача опроса нажатия на тач всегда прерывает задачу отрисовки. Я как то упустил из виду что TFT_eSPI не использует вывод IRQ тача, а использует опрос SPI.
Для работы с ресурсом выделяй всегда ОДИН поток и общайся с ним через xQueue.
В данном случае следует сделать поток в котором исполнять ЛЮБОЙ запрос к объекту TFT. Если по мере создания кода нужен метод от TFT, то его следует вызывать через “обертку” указанной очереди.