GD32F4xx官方库踩坑记录

项目背景

移植FreeRTOS+LWIP。

参照官方例程:GD32F4xx_Demo_Suites_V2.6.2.rar

地址:兆易创新GigaDevice-资料下载兆易创新GD32 MCUicon-default.png?t=N7T8https://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,不利于用户移植和参考。谁会想到例程中改了这个配置选项呢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值