блоки lwip_select даже после закрытия сокета - PullRequest
0 голосов
/ 23 октября 2019

В моем текущем приложении у меня есть задача 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

Любые возможные варианты решения этой проблемы будут полезны.

Спасибо

...