Hi, i am using FreeRTOS+TCP library for MQTT Mutual Authentication application.
I am using socket wrapper layer given by Free RTOS demo application. My application is giving socket connection error and it is not consistent but connects once in a while, I tried to close socket when it fails and used FreeRTOS_connect() to try connection again, but this gives hardfault exception. can anyone suggest what can be the possible ways to fix this.
Error message: "Failed to connect to server: FreeRTOS_Connect failed: ReturnCode= -116
Attaching screenshot below.
I’m not sure what I’m meant to be looking at in the screenshot - but I can see you using the tickless mode and semihosting. For debugging I would recommend setting configUSE_TICKLESS_IDLE to 0 to prevent the MCU going into a sleep mode, and turn off semihosting as it conflicts with FreeRTOS’s use of exceptions.
Thankyou for the response.
I am using cortexM55 based hardware which uses ethernet for network,
I am working on development of MQTT Mutual Authentication application where i am using mbedTLS and PKCS modules.
For socket wrapper layer(for socket connection), i am using FreeRTOS pkcs11_MQTT_Mutual_Authentication as reference and following the same.
As the socket connection was not getting established each time i try to run application on the board. I am not very sure what exactly i am missing.
It would be gret if you can enlighten me with sometips to achieve this. THANKS!
If you can capture network traffic that would be very useful to find out the cause of connection failure.
Also, turn off tickelsss idle as Richard suggested.
Thankyou.
sure will check network traffic, i have changed configUSE_TICKLESS_IDLE to 0, but still socket connection is established few times when i run the application and not getting connected for sometime. attching logs below. THANKS!
The actual “timeout” depends on what you have defined for ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME.
Or you may have overruled this value by setting the socket option FREERTOS_SO_SNDTIMEO.
Both macros define a value in number of clock ticks.
When creating a TCP server calling accept(), you can set the maximum blocking time by defining ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME. Or by setting the socket option FREERTOS_SO_RCVTIMEO.
Hi, Thanks for the reply. I didn’t work on this for sometime, hence couldn’t reply you. I restarted working on it. I am attaching file below. It would be helpful if you can check and let me know. Sockets_Wrapper.c (5.1 KB)
below are the timeout values in my project. #define ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME ( 5000 ) #define FREERTOS_SO_RCVTIMEO ( 0 ) /* Used to set the receive time out. / #define FREERTOS_SO_SNDTIMEO ( 1 ) / Used to set the send time out. */ #define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME ( 5000 )
This example puts them to 2.5 seconds, but you may choose a longer period.
Can you tell the actual value of the parameter receiveTimeoutMs?
As I wrote earlier, FreeRTOS_connect() uses FREERTOS_SO_SNDTIMEO as its timeout, whereas FreeRTOS_accept() takes the value of FREERTOS_SO_RCVTIMEO.
Although most TCP connections to a host on the Internet are established very quickly, you better use large timeouts, up to 20 seconds.
Note that FreeRTOS_shutdown() should only be called as long as the socket is in a connected state, although FreeRTOS_recv() will return an error if the socket is not connected anymore.
Hi @htibosch, thanks for the information.
I have increased the timeout of FreeRTOS_connect() to 10seconds. Now i am not getting any socket connection error. My MQTT application is working.
Thanks !!