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

共5条 1/1 1 跳转至

VxWorks中关于muxSend()的问题

菜鸟
2005-09-09 17:57:55     打赏

我想用muxSend()来发送一个自己填充的数据帧,其中由于对M_BLK_ID pMblk结构不是很了解,我也只是通过WindRiver提供的文档已经一些头文件来猜测着填充pMblk的各个成员。整个程序的主要步骤如下:

STATUS muxSendData() //The entry of the program
{
int j;
char *ifname = "motfec";//网络接口名
int unit = 0;

M_BLK_ID pMblk = (M_BLK_ID)malloc(1 * sizeof(M_BLK));

unsigned char PktHeader[] =
{ 0x00,0x10,0x4b,0x08,0xca,0x1c, //目的MAC
0x08,0x00,0x3e,0x32,0x53,0x22,//源MAC
0x81,0x00,//协议类型
0x20,0x01,//其他字段
0x00,0x52
};
struct ifnet *pIfnet; //Pointer to your network interface's ifnet struct

monitorSendBindCookie = muxBind ("motfec", 0, NULL,
NULL, NULL, NULL, MUX_PROTO_SNARF, NULL, NULL);

if(monitorSendBindCookie == NULL)
{
logMsg("monitor SendBindCookie:Can't bind to %s%d!\n",ifname,unit);
return(ERROR);
}
logMsg("Data Monitor By Mux:%s%d Bind OK!!\n",ifname,unit);

//bzero ((unsigned char *)&pMblk,sizeof(M_BLK));

pMblk->mBlkHdr.mNext = NULL;
pMblk->mBlkHdr.mNextPkt = NULL;
pMblk->mBlkHdr.mData = PktHeader;
pMblk->mBlkHdr.mLen = 82;
pMblk->mBlkHdr.mType = MT_DATA;

pMblk->mBlkHdr.mFlags = M_FORWARD;
pMblk->mBlkHdr.reserved = 0x8100;

// get the ifnet pointer of your network interface
pIfnet = ifunit ("motfec0");

if (pIfnet == (struct ifnet *) NULL)
{
printf ("ifunit failed\n");
return (ERROR);
}
pMblk->mBlkPktHdr.rcvif = pIfnet;
pMblk->mBlkPktHdr.len = 82;
pMblk->pClBlk = g_pMblk->pClBlk;

for(j = 0; j < 5; j++)
{
muxSend(monitorSendBindCookie,pMblk);
}

printf("Over");

return (OK);
}

问题:

当我运行后,系统只发了2个帧(我总共需要发5个帧),VxWorks下的tNetTask就被SUSPEND+I了,只能重启后才能重新唤起tNetTask。

错误提示信息是:

data access
Exception current instruction address: 0x0005ab10
Machine Status Register: 0x00009030
Data Access Register: 0x0010da94
Condition Register: 0x40000043
Data storage interrupt Register: 0x00000084
Task: 0x1fa75b8 "tNetTask"

需要大家的帮助,谢谢大家了!!!!

我的运行平台是:

Tornado 2.2

VxWorks 5.5

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



关键词: VxWorks     关于     muxSend     问题    

菜鸟
2005-09-10 00:58:00     打赏
2楼

真的没有人能帮我吗???

真诚期待好心人的帮助!!!!!


菜鸟
2005-09-12 16:27:00     打赏
3楼

还没人回帖,晕!!

郁闷!!!


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

首先,感谢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天,所以提出的问题可能有些低级,希望各位不要见笑了!

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

谢谢了!


菜鸟
2005-09-14 00:35:00     打赏
5楼

调网口是很郁闷的事情...


共5条 1/1 1 跳转至

回复

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