Using a zynq board, I spent a good bit of time scratching my head recently trying to figure out why networking with FreeRTOS+TCP would seem to init but silently fail. Every sign seemed to show that the networking stack was up and ready to process events, but the board refused to receive or send any sort of network traffic. Pings were ignored, TCP connections were ignored, and wireshark showed no sort of acknowledgement from the board’s IP.
The solution that I discovered came after retrying a demo program, and noting that it defined
ucMACAddress in main.c. Despite the fact that I had passed the same exact MAC address into
FreeRTOS_IPInit, that value was only used later in the initialization process. Instead,
ucMACAddresss is defined as extern in the associated
NetworkInterface.c for Zynq.
It was pretty unclear that setting
main.c was crucial for the networking stack to come up at all (save for a single comment in
NetworkInterface over the variable itself), and that it was separate from the mac address parameter passed into FreeRTOS_IPInit(). Not only that, but there were absolutely zero indications or messages indicating that the value was unset. It seems like an assert or printf indicating the unset value would have made the problem a lot clearer and easier to diagnose.