ESP8266 Developer Zone The Official ESP8266 Forum 2016-06-22T14:56:15+08:00 https://bbs.espressif.com:443/feed.php?f=7&t=664 2016-06-22T14:56:15+08:00 2016-06-22T14:56:15+08:00 https://bbs.espressif.com:443/viewtopic.php?t=664&p=7467#p7467 <![CDATA[Re: Does lwip socket in RTOS supports select()?]]>
baoshi wrote:
I got it.
It seems tv_sec is internally counted by FreeRTOS tick. I did the following trick and the timeout works.

Code:

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    // It seems esp_iot_rtos_sdk interprets timeout by FreeRTOS ticks.
    tv.tv_sec = timeout_ms / portTICK_RATE_MS;
    tv.tv_usec = 0;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}


in RTOS_SDK 1.3 the tv_sec seems to be tick.
in RTOS_SDK 1.4 the tv_sec seems to be the real seconds (CPU running at 80MHZ, and half seconds with CPU running at 160MHZ)

Statistics: Posted by tobewinner — Wed Jun 22, 2016 2:56 pm


]]>
2015-06-30T00:17:04+08:00 2015-06-30T00:17:04+08:00 https://bbs.espressif.com:443/viewtopic.php?t=664&p=2432#p2432 <![CDATA[Re: Does lwip socket in RTOS supports select()?]]> It seems tv_sec is internally counted by FreeRTOS tick. I did the following trick and the timeout works.

Code:

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    // It seems esp_iot_rtos_sdk interprets timeout by FreeRTOS ticks.
    tv.tv_sec = timeout_ms / portTICK_RATE_MS;
    tv.tv_usec = 0;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}

Statistics: Posted by baoshi — Tue Jun 30, 2015 12:17 am


]]>
2015-06-30T00:00:31+08:00 2015-06-30T00:00:31+08:00 https://bbs.espressif.com:443/viewtopic.php?t=664&p=2430#p2430 <![CDATA[Does lwip socket in RTOS supports select()?]]>
I created the following code to test the socket API in esp_iot_rtos_sdk.

Code:

int ICACHE_FLASH_ATTR mqtt_esp_read(int my_socket, unsigned char* buffer, int len, int timeout_ms)
{
    struct timeval tv;
    fd_set fdset;
    int rc = 0;
    int rcvd = 0;
    FD_ZERO(&fdset);
    FD_SET(my_socket, &fdset);
    tv.tv_sec = 0;
    tv.tv_usec = timeout_ms * 1000;
    rc = select(my_socket + 1, &fdset, 0, 0, &tv);
    if ((rc > 0) && (FD_ISSET(my_socket, &fdset)))
    {
        rcvd = recv(my_socket, buffer, len, 0);
    }
    else
    {
        // select fail
        return -1;
    }
    return rcvd;
}


The socket was created using

Code:

 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)


It seems that the timeout feature of select() is not functional. select() always returns in ~46us when no data is available to read.

Is there anything I did wrongly or it is not supported in the SDK?

Thanks

Baoshi

Statistics: Posted by baoshi — Tue Jun 30, 2015 12:00 am


]]>