项目背景
移植FreeRTOS+LWIP。
参照官方例程:GD32F4xx_Demo_Suites_V2.6.2.rar
地址:兆易创新GigaDevice-资料下载兆易创新GD32 MCUhttps://gd32mcu.com/cn/download/0?kw=GD32F4
移植过程
使用FR和LWIP官方代码。
使用GD的驱动。参考代码:
GD32F4xx_Demo_Suites_V2.6.2.rar\GD32F4xx_Demo_Suites_V2.6.2\GD32470Z_EVAL_Demo_Suites\Projects\26_ENET\Projects\FreeRTOS_tcpudp\src
GD32F4xx_Demo_Suites_V2.6.2.rar\GD32F4xx_Demo_Suites_V2.6.2\GD32470Z_EVAL_Demo_Suites\Projects\26_ENET\Third_party\lwip-2.1.2\port\GD32F4xx\FreeRTOS
应用层参考LWIP官方例程:LWIP\contrib-2.1.0\apps\tcpecho
问题现象
使用网络调试助手,先连接再断开连接。
程序就跑死了:
查看队列中的内容,uxItemSize被改了:
问题原因
LWIP默认使能了内核锁定。使用全局互斥锁替代消息机制。
解决措施
取消内核锁定,改为消息机制。
在lwipopts.h中定义:
#define LWIP_TCPIP_CORE_LOCKING 0
坑
那,为什么GD例程就没有问题呢?
那是因为,GD的工程师把LWIP库中的opt.h文件给改了,把LWIP_TCPIP_CORE_LOCKING的默认值改成0了。
正确的配置方法
这里要@GD32F4XX的开发工程师了,正确的配置方法是,在LWIP提供给用户的配置文件lwipopts.h文件中定义。
因为opt.h会包含lwipopts.h,如果定义定义了该宏,就使用用户定义的值。只有在用户没有定义时,才会使用默认定义。
那为什么不能直接更改opt.h呢?
1,不便于于库升级;因为opt.h是属于内核代码的一部分;lwipopts.h才是用户代码。
2,不利于用户移植和参考。谁会想到例程中改了这个配置选项呢。