网友jyx0928给我发邮件提出来的以下几个问题,我在这里做一个简单的回答。如果有不正确的地方,希望大家批评指教,谢谢!技术需要大家共同讨论提高!
问题1:
main函数中建立任务T_LwIPEntry,
T_LwIPEntry工作主要为初始化目标板,网卡,lwip(其中建立tcpip_thread,ethernetif_input这2个任务),然后建立任务tcpecho;
tcpecho任务为tcp客户端,连接指定服务器
现在共5个任务,优先级为:
main
T_LwIPEntry 11
tcpip_thread 6
ethernetif_input 20
tcpecho 10
ethernetif_input任务中,数据也是按照小盒子你的查询方式来做的,之前将该任务优先级改为8,就是比T_LwIPEntry和tcpecho高,但是这样好像只要ethernetif_input任务一建立,T_LwIPEntry和tcpecho任务就不执行了,因为ethernetif_input任务中我用查询方式一直在查询网卡,一直在占用cpu;所以改用上面的优先级,将数据接收任务优先级改为最低。这样tcp任务就能正常运行;
所以我的问题就是,为什么你的移植里面将ethernetif_input任务的优先级设为第二高,应用层的任务怎么还能正常运行呢?
答:你说的ethernetif_input任务中我用查询方式一直在查询网卡,一直在占用cpu。我很想知道你的ethernetif_input()这个函数你是如何写的?
我把我的代码片段贴出来你参考一下
ethernetif = netif->state;
do{
p = low_level_input(netif);
if (p == NULL)
OSTimeDlyHMSM(0,0,0,100);
}while(p == NULL);
注意红色的部分。如果p==NULL这样就要把让CPU去执行其他别的任务,不要始终占用CPU,所以很肯能是这里导致你的不行。明白了吗?
问题2:
我用上面的优先级能正常运行tcp任务,但是:
现象1:我先运行程序,等待一段时间再打开服务器端,结果程序并没有马上连接,而是等待了几十秒(这时时间不定,最少30秒,长的几分钟)才连接上。为什么要等上一些时间才能连接呢?
答:应该不会出现你说的这个现象,你调试程序的时候是使用的仿真器吗?仿真器的话速度会慢一些,虽然慢但是不至于几分钟。会不会是你的网络问题?对于你的现象,我重新做了一次测试
我的环境是
CPU S3C2440 (400MHz)
以太网:DM9000
UCOS:V2.86
LWIP:1.2.0
板子为客户端,PC机为服务端,整个启动过程除掉uboot和初始化以太网,连接仅在1s内完成。