搜索
bottom↓
回复: 27

LM3S8962 + LwIP + 无操作系统,长时间数据收发问题的解决

  [复制链接]

出40入42汤圆

发表于 2013-9-10 09:39:55 | 显示全部楼层 |阅读模式
本帖最后由 落叶知秋 于 2013-9-10 09:45 编辑

    之前拿了一块LM3S8962的开发板,说要调以太网,又给了一些LwIP的相关资料。
好吧,以太网之前没接触过,想着就来触一下呗。结果捣鼓折腾了一个月,现在才
首次实现当初要求的实时通讯的功能。上图!注:不带操作系统,裸奔!

    一开始找移植资料,开始读老衲五木大大的源码详解,感觉讲得还是很不错滴,起码自己
之前是不懂TCP/IP的东西的,里面有结合源码去讲。然后就是去找各种移植的博客文章,LwIP的
WIKI、官网。最后最直接的例子来自TI官网的关于LwIP的例程。下载了一个StellarisWare,里面就
有各种例程。TI在8962上移植好了LwIP-1.3.2,直接写进8962就可以跑。当一边看着移植好的程序结构,
再回头去看那些写得云里雾里的移植步骤,天气顿时晴朗起来了!

    后来在例程的基础上修改为数据收发的功能(类似于LwIP官网可以下载的贡献者写的应用例程tcp_echo的功能),
发现了问题!不能长时间收发!大概发了一、两个小时就停了!这个点上卡了好久,各种读代码,各种论坛求助和
Q群求助,都没什么进展。最后还是静下心来,按照调试和实验的经验一步一步来。注:不带操作系统,裸奔!

    先列出可疑点,再验证,排除可疑点,修改实验条件,再重新验证……不断地循环。LwIP都被使用了那么久,
应该不会有这种BUG的。带着这样的想法,开始探讨自己对LwIP的使用方法和配置是否正确。

    在这里推荐一个网站,是LwIP的Mail-list里面的人群发的遇到的各种问题,是e文的,可以看懂的朋友可以上去搜一下遇到的问题。
    (lists.gnu.org/archive/html/lwip-users/)      lwip-users Archives(没权限发链接……艹)

    调试过程很漫长,用了抓包软件wireshark做分析和LwIP自带的串口调试信息做参考,以上两个办法还是挺通用的。后来一个契机让我
找到了一些眉目!移植LwIP-1.4.1!
    移植1.4.1时,遇到了可以接收数据,但不能发送数据的问题!后来查明是我在另外一个帖子 www.amobbs.com/thread-5542960-2-1.html    LwIP移植的相关帖子
提及过的宏定义问题!
    注意哦!在我替换TI更改的宏定义前,我单独做了一下1.4.1的接收功能的测试,只收不发。结果收了一整天都不会出问题!
    但是替换了TI更改的宏定义后,就出现了以前用1.3.2时一模一样的问题,收发一段时间就停了。单独做接收测试,也是会停!
    结合以上两点,在宏定义里下了功夫。又过去了一天……然后就可以了!!


    最后的问题的根源如图所示。是一个TCP的宏定义的问题,在这里说一下,用的编译器是IAR,TI官方说那里有个IAR的BUG,说明他们都
已经知道那里有问题了,但是为毛他们改了之后还是有问题?而且想一下就知道他们改的不行!有符号跟无符号数据类型!!!说明他们没有
做好测试这一块嘛!
    而且诡异的一点是,看我修改的地方,就是把大于和大于等于两个宏定义跟小于和小于等于取了一下反,就可以了!难道说,IAR只认其中的小于和小于等于?
大于和大于等于就出问题?希望知道这是什么情况的大神可以回个贴,告知告知一下……那就先谢过了

    好了,可以通讯了……可以向下一步迈进了……继续长时间收发测试,希望不会停……也希望此帖能够为那些为同样或类似问题抓头的朋友提供一个案例经验。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2013-9-10 10:20:05 | 显示全部楼层
帮顶,不错,现在还没用

出0入0汤圆

发表于 2013-9-10 11:42:11 | 显示全部楼层
顶顶顶顶

出40入42汤圆

 楼主| 发表于 2013-9-11 21:19:21 | 显示全部楼层
本帖最后由 落叶知秋 于 2013-9-11 21:27 编辑

号外~!
…………目前数据收发了48个小时没有出现问题,如图1所示啊。

由于手头只有一块板子,所以一直让它跑着,没有做其他实验。现在跑了两天两夜没问题,就开始做实验了。结果…………

结果是:找到了问题的根本原因了……但很遗憾的是,本帖的一楼的修改方式和问题的原因压根儿就没有半毛钱关系!

在这里向各位看过贴子的朋友道个歉!!

好吧,上这次找到的原因。
根本原因:
IAR编译器的代码优化功能,导致了本帖提及的宏定义
#define TCP_SEQ_LT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)
#define TCP_SEQ_LEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)
#define TCP_SEQ_GT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)
#define TCP_SEQ_GEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)

#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
编译出来的汇编代码出现了偏差!!
上图!以tcp_process()函数里面的一个判断为例子!
如图2所示,采用了none的优化,即是无代码优化的情况。
图3是tcp_process()函数的入口。
图4是none优化下的汇编代码,红框里的是一个TCP_SEG_BETWEEN的汇编代码。
图5所示的,是采用了low_level的优化。
图6是low_level优化下的同一个地方的汇编代码。
可以看出来,none优化比low_level优化汇编代码长了好几行!而且low_level的只有一个CMP指令!Between应该有两个的啊……

好了,原因就是以上说的编译器优化的问题!……顺便一提,一楼取反的方法是可取的,但是没什么意义……使用源码中的宏定义更加清晰一些。
在这里不得不发一句牢骚……TI,你搞毛线啊!是时候修改你的例程了!有BUG要说是什么样的BUG嘛,艹!……省略很多字。

再次向各位看过帖子的朋友致歉,也望各位开发的时候注意这个问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入101汤圆

发表于 2013-9-11 23:45:32 | 显示全部楼层
一般不需要开优化。

出0入0汤圆

发表于 2013-9-12 16:46:16 | 显示全部楼层
先做个标记,以前也遇到了这样的问题,后来采用了RTThread操作系统,目前效果还可以

出0入0汤圆

发表于 2013-12-31 11:09:41 | 显示全部楼层
流控制怎么弄?

出0入0汤圆

发表于 2013-12-31 11:37:34 | 显示全部楼层
这个必须顶。  为lz的 过程。。。顶起。。。。。。。。。。。

出40入42汤圆

 楼主| 发表于 2014-2-13 20:16:36 | 显示全部楼层
arm 发表于 2013-12-31 11:09
流控制怎么弄?

真不好意思,很久没有上论坛了,现在才看到消息……
恕我不才,你说的“流控制”具体指哪个方面?能不能具体描述一下?
我在做LWIP的时候,是直接拿TI的驱动库和例程,对着资料查接口的使用方法,然后自己编程使用的。
你说的速度慢,有各种原因,是不是参数没有设置好?是不是数据处理过程过于繁琐?
如果是参数的话,到lwipopt.h文件中去了解参数的意义。不过速度快需要内存的支持。

出40入42汤圆

 楼主| 发表于 2014-2-13 20:24:18 | 显示全部楼层
zzz1367 发表于 2013-12-31 11:37
这个必须顶。  为lz的 过程。。。顶起。。。。。。。。。。。

谢谢帮顶

出0入0汤圆

发表于 2014-2-16 22:23:48 | 显示全部楼层
这样的过程,必须顶你

出0入0汤圆

发表于 2014-2-17 08:29:10 | 显示全部楼层
thanks a lot

出0入0汤圆

发表于 2014-2-17 10:05:34 | 显示全部楼层
这个必须支持一个,好东西。

出0入0汤圆

发表于 2014-3-11 17:04:39 | 显示全部楼层
楼主!你好!能否将您的程序分享一下!谢谢!

出130入20汤圆

发表于 2014-3-11 17:17:57 | 显示全部楼层
LM3S8962这片子还有人玩,我有个开发板吃灰,谁要谁收去

出0入0汤圆

发表于 2014-3-11 23:08:11 来自手机 | 显示全部楼层
学习了!!!

出40入42汤圆

 楼主| 发表于 2014-3-12 08:44:26 | 显示全部楼层
wangfeimartin 发表于 2014-3-11 17:04
楼主!你好!能否将您的程序分享一下!谢谢!

例程可以到TI的官方网站去下载。我的程序就是在那个基础上修改过来的。

出40入42汤圆

 楼主| 发表于 2014-3-12 08:46:10 | 显示全部楼层
shuiluo2 发表于 2014-3-11 17:17
LM3S8962这片子还有人玩,我有个开发板吃灰,谁要谁收去

8962的确是比较旧了,那时候是用来练手,现在是用NXP的芯片。

出0入0汤圆

发表于 2014-3-12 09:00:34 | 显示全部楼层
没玩过

出0入0汤圆

发表于 2014-4-1 09:08:31 | 显示全部楼层
楼主写的确实比较详细

出0入0汤圆

发表于 2014-5-27 09:47:29 | 显示全部楼层
落叶知秋 发表于 2014-3-12 08:46
8962的确是比较旧了,那时候是用来练手,现在是用NXP的芯片。

请教楼主,现在用NXP的哪个型号替代了LM3S8962?我这项目也在做选型,公司放着STM32热门的不用,非让选TI或者NXP的。。。

出40入42汤圆

 楼主| 发表于 2014-5-28 22:48:29 | 显示全部楼层
gerbansh520 发表于 2014-5-27 09:47
请教楼主,现在用NXP的哪个型号替代了LM3S8962?我这项目也在做选型,公司放着STM32热门的不用,非让选TI ...


NXP的LPC17xx和LPC43xx系列中,有支持以太网的型号的,具体你可以去周立功的网站了解下。

出0入0汤圆

发表于 2014-5-29 10:57:47 | 显示全部楼层
落叶知秋 发表于 2014-5-28 22:48
NXP的LPC17xx和LPC43xx系列中,有支持以太网的型号的,具体你可以去周立功的网站了解下。 ...

谢谢楼主,公司上层要用LPC1768来做,不用STM32的原因是周立功有技术支持长期来我们公司。

出0入0汤圆

发表于 2014-11-15 00:18:45 | 显示全部楼层
明天研究这个

出0入0汤圆

发表于 2015-12-16 16:25:03 | 显示全部楼层
楼主写的好详细,虽然没看明白

出40入42汤圆

 楼主| 发表于 2015-12-16 17:38:11 | 显示全部楼层
飞舞的鬼车 发表于 2015-12-16 16:25
楼主写的好详细,虽然没看明白

这么旧的贴子都被你翻出来,真是捧场。

老实告诉我,你是来灌水拿分的吧?

出0入0汤圆

发表于 2017-4-12 10:15:39 | 显示全部楼层
这个宏很差经,基本上初级优化就优化成了: a<b

如果连初级优化都不过,说明程序写得有问题。

在无符号和符号转换时,要小心。这宏里面太多的符号转换了。

出0入0汤圆

发表于 2021-9-25 15:11:58 | 显示全部楼层
感谢楼主无私分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 17:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表