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

Задачи rtos sdk - почему-то работает только одна

hd44780

New member
Начал писать задачи и столкнулся со странностью - из двух моих задач работает только одна.


1-й таск - приём байтов из UART:

Код:
[INDENT]// Задача - приём данных UART
[INDENT][INDENT]static void ICACHE_FLASH_ATTR task_uartReceive ( os_event_t *events )
{
uint8_t temp;
// add transparent determine
while ( READ_PERI_REG ( UART_STATUS(UART0) ) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S) )
{
// temp = READ_PERI_REG(UART_FIFO(UART0)) & 0xFF;
WRITE_PERI_REG ( 0X60000914, 0x73 ); //WTD
// читаем байт из UART
temp = READ_PERI_REG ( UART_FIFO(UART0) ) & 0xFF;
// Эхо
uart0_sendByte ( temp );
// сохраняем байт в буфере
cmdBuffer [ cmdBufferWriteIdx ++ ] = temp;
// Закольцовываем
if ( cmdBufferWriteIdx == CMD_BUFFER_SIZE )
cmdBufferWriteIdx = 0;
} // while
if ( UART_RXFIFO_FULL_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_FULL_INT_ST) )
{
WRITE_PERI_REG ( UART_INT_CLR(UART0), UART_RXFIFO_FULL_INT_CLR );
} // if
else
if ( UART_RXFIFO_TOUT_INT_ST == (READ_PERI_REG(UART_INT_ST(UART0)) & UART_RXFIFO_TOUT_INT_ST) )
{
WRITE_PERI_REG ( UART_INT_CLR(UART0), UART_RXFIFO_TOUT_INT_CLR );
} // if
ETS_UART_INTR_ENABLE ( );
} // task_uartReceive[/INDENT][/INDENT][/INDENT]
Просто принимает байты, отсылает обратно (эхо, для контроля работоспособности) и кладёт их в кольцевой буфер (128 байт).

2-й таск. Обработка команд. Для отладки я отсюда всё убрал, оставил только отладочный вывод.
Код:
// Выполнение команд
static void ICACHE_FLASH_ATTR task_executeCommands ( os_event_t *events )
{
     uart0_sendStr ( "exec:\r\n" );
} // task_executeCommands
Инициализация задач:
Код:
// Инициализация задач OS
void ICACHE_FLASH_ATTR os_tasks_init ( void )
{
// инициализация указателей буфера
  cmdBufferWriteIdx = cmdBufferReadIdx = 0;

// at_recvTask - Uart receive task
system_os_task ( task_uartReceive, taskReceivePrio, taskReceiveQueue, taskReceiveQueueLen );

// at_procTask - Task of process command or txdata
system_os_task ( task_executeCommands, taskExecutePrio, taskExecuteQueue, taskExecuteQueueLen );
} // os_tasks_init
Инициализация вызывается из user_init, uart0_sendStr работает нормально (вывод из user_init приходит).
Проблема в том, что в терминале я вижу только эхо посылаемых мной байт (1-я задача). Эхо не терминала, именно от модуля (смотрел в SerialPort Monitor). Но строки exec: я нигде не вижу :(

В чём я ошибся?
Полный проект приложил.
Спасибо.
 

Вложения

Последнее редактирование:

hd44780

New member
Кажется я понял прикол.
Таски сами по себе не вызываются (как я думал исходя из опыта работы с FreeRTOS), их надо дёргать командой типа
system_os_post(taskReceivePrio, 0, 0);

Позже проверю ...
 

pvvx

Активный участник сообщества
Кажется я понял прикол.
Таски сами по себе не вызываются (как я думал исходя из опыта работы с FreeRTOS), их надо дёргать командой типа
system_os_post(taskReceivePrio, 0, 0);
У вас не esp_iot_rtos_sdk, а простой - "однозадачный". freertos в esp_iot_rtos_sdk и там xTaskCreate(taskN, "tskN", ?,?,?,?);....
 
Последнее редактирование:
  • Like
Реакции: A_D

hd44780

New member
Да, простой.
Пока на нём пробую сделать, если что, перейду на другой.
 

hd44780

New member
Да, знаю. Вначале так написал, неверно понимая логику работы системы.
Но средств изменить название темы я не нашёл.
Вызвал system_os_post, таск вызвался и нормально отработал. Но пока это пустышка.

Пошёл ваять дальше.


 

hd44780

New member
Подключил всё, что надо в таски - работает нормально.
Доделываю дальше :)
 
Сверху Снизу