zlIP速度的问题

凤朝凰 2009-03-31 06:15:55
我正在使用zlIP做PC和MCU的TCP通信。MCU作为服务器,PC作为客户端。连接之后PC发送一次数据等待MCU处理完成后回发一组数据才去执行下面的工作。
现在的问题是PC段每次从调用CSocket的Send函数到CSocket的Receive函数执行完毕都需要消耗500毫秒左右的时间。
哪位大侠可以告诉我为什么,怎样才能提高通信速度,非常感谢!!!
...全文
185 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
morris88 2009-04-15
  • 打赏
  • 举报
回复
不用,我不想再看看 zlIP 代码,以前看过 bsd / linux / vxworks 等下面的源代码的实现,没有一个在中断实现的。
凤朝凰 2009-04-15
  • 打赏
  • 举报
回复
好吧
结贴吧
我也烦了这个问题了
有空了慢慢考虑吧
再次谢谢各位的帮助
morris88 2009-04-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wangbinds 的回复:]
不做中断中处理在哪儿处理?原来的程序中,主函数在完成初始化之后就是空循环了。
另外我曾经试过提高单片机频率,从25M提高到40M,PC端显示的时间没有明显的变化。
我觉得单片机的速度问题还不是主要原因,不知道对不对。
[/Quote]

一般由于 ip 协议栈处理比较复杂,需要花费较长时间来执行,所以不会放在中断中来执行,以避免丢失中断或中断延迟过长等问题。它一般都会在中端完成后,有操作系统进行管理其什么时候开始执行协议栈代码。
假定 25M 时需要 500ms,那么提高到 40M,需要:
500 / (40 / 25) ms = 50 * 25 / 40 ms = 312.5 ms
人的肉眼感觉能区别 400ms 与 312.5 ms,貌似都会感觉的很慢吧...
凤朝凰 2009-04-14
  • 打赏
  • 举报
回复
感谢morris88 大大的耐心指导。
不知道可否帮我找出zlIP到底是在合适解析协议栈的,我实在是看不懂除了中断还有什么地方了(周立功网站有源码,或者我发给你)。
另外我说的时间没有明显变化是指的PC输出的时间数据,具体可看我上面贴出的代码。无论我是用25M的晶振还是40M的晶振,PC输出的用时都是480+到510+的范围,并没有发现输出时间在范围上的变化。

另:谁知道如何加分请告诉我,我再加些分继续期待几天。
LWdaidai 2009-04-12
  • 打赏
  • 举报
回复
帮顶
凤朝凰 2009-04-12
  • 打赏
  • 举报
回复
再次顶起
过几天结贴好了
再次期待高手帮忙
也谢谢大家
gx19890101 2009-04-11
  • 打赏
  • 举报
回复
ding
wzzlin 2009-04-10
  • 打赏
  • 举报
回复
ZLIP0.2版本还不是很完善,ZLIP官方网站已经出到ZLIPV1.0增值版,应该不会有反应慢的问题。
另外你如果怕麻烦的话直接使用基于ZLIPV1.0的硬件模块ZLSN2000,免去了调试各种代码问题的麻烦。

ZLSN2000 可以进行二次开发。在用户选择单片机网络方案的时候,可能比较关心是否能够进行二次开发。如果能够提供TCP/IP源代码,那么用户就可以直接调用类似connect, send, receive, closet, listen等socket函数,开发出用户自己的程序。一般地模块方案无法提供这些接口。卓岚科技的ZLSN2000模块充分考虑到用户的需求,提供了模块和主单片机的命令接口。主单片机通过串口发送socket命令给模块,例如让模块向某个地址进行连接,即发送 connect yourip: youport 给模块即可。这相当于用户可以直接调用socket函数。
凤朝凰 2009-04-10
  • 打赏
  • 举报
回复
自己顶一下
morris88 2009-04-09
  • 打赏
  • 举报
回复
MCU的处理能力跟PC机相差多少呢?一般来说,单片机处理能力较低,而协议栈处理较复杂,需要执行很长的代码,那就需要花很多的时间了。
凤朝凰 2009-04-09
  • 打赏
  • 举报
回复
应该不是阻塞的问题,我写的服务器程序同样使用阻塞模式的CSocket类,在同一局域网的另一台机器运行。两台PC间通信速度就很快,显示的时间一般都是0。所以认为应该不是阻塞造成的。
问题应该就出现在MCU这边,只是不知道在哪儿,也不知道怎么找到问题。
我用示波器看到单片机执行定时中断函数的时间是很短的,始终都是微秒级的。
morris88 2009-04-09
  • 打赏
  • 举报
回复
貌似使用非阻塞方式:


int flags = fcntl(sock, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(sock, F_SETFL, flags);
凤朝凰 2009-04-09
  • 打赏
  • 举报
回复
忘写了在调试速度的过程中我每次只是发送一个字节0x40的
凤朝凰 2009-04-09
  • 打赏
  • 举报
回复
感谢 shuiyan 大哥的帮忙,我试过了什么都不做就返回信息,也试过了直接用买的板子和程序与我做的PC程序通信,显示的耗时基本相同。一下是PC端的VC代码

int CReceiveInSendSocket::Send(const void* lpBuf, int nBufLen, int nFlags)
{

//2009年3月18日13:09:50添加 用于输出本函数执行的处理器时间
clock_t start=clock();

// TODO: Add your specialized code here and/or call the base class
if(nBufLen==0)
return 0;
CSocket::Send(lpBuf, nBufLen, nFlags);
int i= Receive();

TRACE("发送数据所用时间:%d\n",clock()-start);
return i;
}
发送时调用此函数,TRACE语句输出的时间就在500毫秒左右。
下面是MCU端keil c代码

void OnAcceptRecv(void DT_XDATA *buf,WORD size) REENTRANT_MUL
{
/* printf received data */
#ifdef DEBUG
while(size--)
printf("%c",*((BYTE DT_XDATA *)buf)++);
#endif
char DT_XDATA EndDeal[]={0xff}; //一下部分为简单修改原来的程序

OrderManage(buf,size); //命令响应函数,调试用的命令什么都没有做
if(Length==0)
TCPSend(ExAccept,EndDeal,1);//命令响应函数什么都不做 Length==0所以回发一个0xff
TCPSend(ExAccept,SendData,Length);//此处Length为0应该不发送任何数据
Length=0;
}
请麻烦各位继续帮忙看看是哪儿的问题非常感谢!!
凤朝凰 2009-04-09
  • 打赏
  • 举报
回复
不做中断中处理在哪儿处理?原来的程序中,主函数在完成初始化之后就是空循环了。
另外我曾经试过提高单片机频率,从25M提高到40M,PC端显示的时间没有明显的变化。
我觉得单片机的速度问题还不是主要原因,不知道对不对。
morris88 2009-04-09
  • 打赏
  • 举报
回复
tcp/ip协议栈不会在中断内处理。只有驱动的某部分会在中断内处理。
凤朝凰 2009-04-09
  • 打赏
  • 举报
回复
协议栈处理时间的问题是我最不能理解的,按我的理解zlIP处理协议栈的时间应该小于定时中断处理函数的执行时间,因为它是在定时中断里处理协议栈的。可是我用示波器看到定时中断处理函数的执行时间却只有十几到计时微秒。
shuiyan 2009-04-08
  • 打赏
  • 举报
回复
zlIP理论上不会这么慢。
send了多少数据?单片机做了什么样的处理?有没有试过单片机什么都不处理,直接返回成功应答的情况下时间多少?
凤朝凰 2009-04-07
  • 打赏
  • 举报
回复
继续等待
高手们帮帮忙啊
凤朝凰 2009-04-03
  • 打赏
  • 举报
回复
谢谢楼上,
继续等待高手帮忙。
加载更多回复(3)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧