佚名通过本文主要向大家介绍了vxworks编程,vxworks网络编程,套接字编程,原始套接字编程,socket套接字编程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 有关VxWorks下套接字编程
描述:
当我服务器端(VxWorks目标机)进入侦听状态,PC客户端发起连接成功后,
当USER_STACK_SIZE取为2000,NET_MSG_MAX_SIZE 取2000,一发起任务VxWorks目标机就重启,PC端显示连接成功。
当USER_STACK_SIZE改为20000之后,又可以正常通信了。
我怀疑是任务栈大小太小,VxWorks无法激活任务就崩溃了,可是这个 任务栈大小该如何设置呢?
此任务是在连接成功后才发起的,即循环接受PC端发送过来的数据。
taskSpawn(TNAME_NETRECV,TPRI_NETRECV,0,USER_STACK_SIZE,
(FUNCPTR)netRecv,0,0,0,0,0,0,0,0,0,0); //netrecv
STATUS netRecv(void)
{
char pBuff[NET_MSG_MAX_SIZE + 1];
int recvLen;
while(flagNetInit == NET_INIT_COMMUSKT)
{
recvLen = recv(commuSkt,pBuff,NET_MSG_MAX_SIZE,0);
if((recvLen != ERROR)&&(recvLen != 0))
{
pBuff[recvLen] = 0;
logMsg("netRecv:received message from client:\n%s\n",(int)pBuff,0,0,0,0,0);
}
else
{
netCloseAll();
return ERROR;
}
}
logMsg("netRecv:net connection is shut down,quit\n",0,0,0,0,0,0);
return OK;
}
解决方案1:
描述:
vxworkstaskSwawnstackSize
最近在搞VxWorks的套接字编程,需要用taskSpawn函数创建并激活任务,其中有个stackSize参数(任务栈大小)。当我服务器端(VxWorks目标机)进入侦听状态,PC客户端发起连接成功后,
当USER_STACK_SIZE取为2000,NET_MSG_MAX_SIZE 取2000,一发起任务VxWorks目标机就重启,PC端显示连接成功。
当USER_STACK_SIZE改为20000之后,又可以正常通信了。
我怀疑是任务栈大小太小,VxWorks无法激活任务就崩溃了,可是这个 任务栈大小该如何设置呢?
此任务是在连接成功后才发起的,即循环接受PC端发送过来的数据。
taskSpawn(TNAME_NETRECV,TPRI_NETRECV,0,USER_STACK_SIZE,
(FUNCPTR)netRecv,0,0,0,0,0,0,0,0,0,0); //netrecv
STATUS netRecv(void)
{
char pBuff[NET_MSG_MAX_SIZE + 1];
int recvLen;
while(flagNetInit == NET_INIT_COMMUSKT)
{
recvLen = recv(commuSkt,pBuff,NET_MSG_MAX_SIZE,0);
if((recvLen != ERROR)&&(recvLen != 0))
{
pBuff[recvLen] = 0;
logMsg("netRecv:received message from client:\n%s\n",(int)pBuff,0,0,0,0,0);
}
else
{
netCloseAll();
return ERROR;
}
}
logMsg("netRecv:net connection is shut down,quit\n",0,0,0,0,0,0);
return OK;
}
解决方案1:
你这一句
char pBuff[NET_MSG_MAX_SIZE + 1];
申请的栈空间就超过NET_MSG_MAX_SIZE了,你设为2000当然不够
自己分析下要用多少栈空间,一般主要是局部变量大小,然后适当留点余量就行了
是这样的,应该先设置大一点,然后使用checkStack查看大概是在什么范围,再设置一个合理的值,这是官方文档上提到的办法
解决方案3:用checkStack可以查看任务堆栈使用情况
解决方案4:确实是任务堆栈影响到了你的任务重启或者任务崩溃,不知你使用的是Tornado2.2还是workbench的平台开发工具,taskSpawn(TNAME_NETRECV,TPRI_NETRECV,0,USER_STACK_SIZE, (FUNCPTR)netRecv,0,0,0,0,0,0,0,0,0,0);其中USER_STACK_SIZE就是你定义的该任务的堆栈空间大小,如果是内核配置的任务可以再kernel配置里面进行配置。