В моем текущем приложении у меня есть задача MQTT, эта задача MQTT активируется другой вспомогательной задачей, когда в сокете есть данные. В настоящее время я достигаю этого с помощью lwip_select. Поэтому, когда бы ни происходило событие, я использую его для запуска задачи MQTT.
Моя вспомогательная задача выглядит примерно так:
...
...
fd_set read_fds;
fd_set write_fds;
fd_set err_fds;
FD_ZERO (&read_fds);
FD_ZERO (&write_fds);
FD_ZERO (&err_fds);
FD_SET (s, &read_fds);
FD_SET (s, &err_fds);
ctx->state = SST_RX_READY;
while( 1 )
{
if (ctx->state == SST_RX_CLOSING)
{
ctx->state = SST_RX_CLOSED;
vTaskDelete( NULL );
}
if( lwip_select( s + 1, &read_fds, &write_fds, &err_fds, NULL ) == -1 )
{
//if socket is closed lwip_select will return -1
vTaskDelete( NULL );
return;
}
if( FD_ISSET( s, &read_fds ) )
{
configASSERT( ctx->rx_callback );
ctx->rx_callback( ( Socket_t )ctx );
//vTaskDelay( 10 ); // delay a little bit to yield time for RX
}
}
...
...
В цикле while я продолжаю вызывать lwip_select, а параметр timeout намеренно остается равным NULL, потому что я не хочу, чтобы эта задача истекалавообще, могут быть длительные периоды времени, когда нет данных для приема из MQTT. Однако, если моя основная задача MQTT завершает свою работу и изящно закрывает сокет, эта вспомогательная задача все еще активна и блокируется на lwip_select.
Некоторая дополнительная информация: OS: Freertos 10.0.1 HW платформа: Cortex m3 LWIP версия: 2.4.0
Любые возможные варианты решения этой проблемы будут полезны.
Спасибо