这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于etherOutput下载出错的问题

共8条 1/1 1 跳转至

关于etherOutput下载出错的问题

菜鸟
2005-09-09 18:18:09     打赏

一个etherOutput()的问题。

在平台:

Tornado 2.2

VxWorks 5.5

下写了个发数据帧的程序,其中用到了etherOutput()这个函数来发送的。其中引用的头文件有:

#include "muxLib.h"
#include "netinet/if_ether.h"
#include "net/if.h"
#include "etherLib.h"
#include "sockLib.h"
#include "inetLib.h"
#include "string.h"
#include "etherDemo.h"//一些结构体的定义

问题:

文件编译build都通过了,但在下载.out到VxWorks中的时候,出现问题了。

提示信息:

Errors while downloading

D:/TornadoPro/SendFrame/PPC860diab/SendFrame.out:
etherOutput

不知道是不是应为5.5之后不支持这个函数了?

希望大家帮忙,谢谢了!!!!




关键词: 关于     etherOutput     下载     错的     问题    

菜鸟
2005-09-09 20:54:00     打赏
2楼

有这个函数啊。

你把它加到vxworks工程中编译试试。


菜鸟
2005-09-10 01:03:00     打赏
3楼

谢谢,斑竹了!!

早上,我用这个办法成功了

不过通过etherOutput发送数据帧不那么理想,不太符合项目的要求

还是得用muxSend()来发数据帧。已经三天了,muxSend这东东就是搞不透。

可能是我对M_BLK这个数据结构的填充有错,发送数据帧总是只发两帧(我要发5帧),发完tNetTask还是被挂掉。

早上也把它加入了VxWorks,结果确实是发了5帧,但tNetTask还是挂掉。

希望得到大家的帮助,我想问题可能不是那么深奥,也希望和大家探讨一下!

谢谢了!!!


菜鸟
2005-09-10 20:27:00     打赏
4楼
muxSend发送的是MBLK,从你的END Driver的NetPool里面申请,然后填充,发送就OK了。详细地看手册,应该会找到的。

菜鸟
2005-09-12 16:36:00     打赏
5楼

感谢xiaohua朋友的回复!!

不过手册上对与muxSend讲解甚是简单,好像并没有怎么用

如果不麻烦,请看看问题的具体描述:

http://bbs.edw.com.cn/dispbbs.asp?boardID=3&ID=47815&page=2 [code]<SCRIPT language=javascript type=text/javascript>
document.write (usercolor('8','xiaohua'));
</script>[/code]


菜鸟
2005-09-12 21:54:00     打赏
6楼

感谢xiaohua

根据你的提示,我解决了我的问题

非常感谢!!!


菜鸟
2005-09-12 22:07:00     打赏
7楼

首先,感谢xiaohua,他提示了我,帮我解决了问题!

既然没有人来解决我的问题,那我把我的解决办法贴上来,可能比较粗糙,希望大家多多指点!

原来我一直不能将帧发完全的主要原因还是出在M_BLK_ID pMblk上,muxSend要发送的数据是都用mBlk,但其中的成员比如pClBlk尤其需要注意,不能简单的将其填充为其他的值。

要使用muxSend()来发送数据只要步骤应该是这样的:首先用muxBind来绑定你要发送的设备,这里我是这样实现的:

muxBind ("motfec", 0, (FUNCPTR)monitorSendProcess,NULL, NULL, NULL, MUX_PROTO_SNARF, "VLAN", NULL);

绑定后应该对NetPool进行初始化操作,应为你要发送的数据mBlk需要从你的NetPool中申请。这一步有些麻烦,我是这样实现的:

变量声明:

NET_POOL_ID pNetPool = (NET_POOL_ID)calloc(1,sizeof(NET_POOL));
M_CL_CONFIG MclBlkConfig;
CL_DESC ClDescTbl;
int ClDescTblNumEnt;

具体实现:

ClDescTbl.clNum = 4;
MclBlkConfig.mBlkNum = ClDescTbl.clNum;
MclBlkConfig.clBlkNum = ClDescTbl.clNum;

//define the M_CL_CONFIG size
MclBlkConfig.memSize = (int)(
((unsigned int)MclBlkConfig.mBlkNum * ( MSIZE + sizeof ( long ))) +
((unsigned int)MclBlkConfig.clBlkNum * ( CL_BLK_SZ + sizeof (long)))
);
//allocate the memery size of M_CL_CONFIG
MclBlkConfig.memArea = (char *)memalign(sizeof (long ),(unsigned int)MclBlkConfig.memSize);
if (MclBlkConfig.memArea == NULL)
{
free( (char *)pNetPool);
//free((char *)pMblk);
return (ERROR);
}
//defin the CL_DESC size
ClDescTbl.memSize = (ClDescTbl.clNum * ( BUFSIZE + 8 ) ) + sizeof ( int ) ;

//allocate the memery size of CL_DESC
ClDescTbl.memArea = (char *) cacheDmaMalloc ( ( unsigned int ) ClDescTbl.memSize );
if ( ( int ) ClDescTbl.memArea == NULL )
{
perror ( "Error: Memory for buffers unavailable" );
free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) pNetPool );
//free((char *)pMblk);
return (ERROR);
}

//initial the netpool
if ( netPoolInit ( pNetPool, &MclBlkConfig, &ClDescTbl, ClDescTblNumEnt, NULL ) == ERROR )
{
perror ( "Error: Could not init buffers" );
free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) ClDescTbl.memArea );
free ( ( char * ) pNetPool );
//free((char *)pMblk);
return (ERROR);

}

//apply for mBlk
pMblk = netMblkGet(pNetPool, M_DONTWAIT, MT_DATA);

这样就基本完成对NetPool的初始化了,并申请了你要发送的pMblk,接下来就是对pMblk指向的数据进行填充,如此这般后,就可以用muxSend发送你要的数据了!

最后,要注意对资源的释放!

free ( ( char * ) MclBlkConfig.memArea );
free ( ( char * ) ClDescTbl.memArea );
free ( ( char * ) pNetPool );

muxSendStop("motfec",0);

由于是刚玩VxWorks编程不到3天,所以提出的问题可能有些低级,希望各位不要见笑了!

更具体代码涉及公司产品机密,恕不能提供。

谢谢了!


[align=right][color=#000066][此贴子已经被作者于2005-9-12 14:09:43编辑过][/color][/align]

菜鸟
2005-09-12 22:12:00     打赏
8楼

晕,回帖贴错地方了!!!

不好意思!


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]