完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我通过下面的代码暂时解决了问题,这个写法是参考一个别人分享的代码。
至于为什么用q->len==28 && q->flags == 0 && q->type == 20做判断条件我也不知,是通过实验得到的。 [AppleScript] 纯文本查看 复制代码 while(1) { accept_err=netconn_accept(conn,&newconn); if (newconn) { struct netbuf *inbuf; char* buf; u16_t buflen; while(netconn_recv(newconn, &inbuf) == ERR_OK) {recv_err=ERR_OK;//sys_arch_protect();//½øÈëÁÙ½çÇøfor(q=inbuf->p;q!=NULL;q=q->next) //±éÀúÍêÕû¸öpbufÁ´±í{if(q->len==28 && q->flags == 0 && q->type == 20){recv_err=ERR_CONN;//printf("rn q->flags=%d ,q->ref=%d ,q->type=%drn",q->flags,q->ref,q->type);break;}//ÔÝʱ½â¾öTCP¶Ï¿ªÁ¬½ÓËÀ»úµÄÎÊÌâ2015-8-17@zzh}//sys_arch_protect();//Í˳öÁÙ½çÇø if(recv_err < ERR_ISCONN)//ÔÝʱ½â¾öTCP¶Ï¿ªÁ¬½ÓËÀ»úµÄÎÊÌâ2015-8-17@zzh{netbuf_delete(inbuf);netconn_close(newconn);netconn_delete(newconn);printf("rn ·þÎñÆ÷¶Ï¿ªÁ¬½Ó rn");break;}else{do{netbuf_data(inbuf, (void**)&buf, &buflen);commandbuf[0]=*buf;commandbuf[1]=*(buf+1);ETH_receive_Handle(commandbuf,buflen);netconn_write(newconn, buf, buflen, NETCONN_COPY);}while (netbuf_next(inbuf) >= 0);//netconn_close(newconn);netbuf_delete(inbuf);} } netconn_close(newconn); netconn_delete(newconn); } } |
|
|
|
|
|
|
|
|
|
|
|
多谢你,我试试,昨晚不小心睡着了
|
|
|
|
[AppleScript] 纯文本查看 复制代码
/*$PAGE*//************************************************************************************************************************** POST TO A SEMAPHORE** Description: This function signals a semaphore** Arguments : p_sem is a pointer to the semaphore** opt determines the type of POST performed:** OS_OPT_POST_1 POST to a single waiting task* OS_OPT_POST_ALL POST to ALL tasks that are waiting on the semaphore** OS_OPT_POST_NO_SCHED Do not call the scheduler** Note(s): 1) OS_OPT_POST_NO_SCHED can be added with one of the other options.** ts is a timestamp indicating when the post occurred.** p_err is a pointer to a variable that will contain an error code returned by this function.** OS_ERR_NONE The call was successful and the semaphore was signaled.* OS_ERR_OBJ_PTR_NULL If 'p_sem' is a NULL pointer.* OS_ERR_OBJ_TYPE If 'p_sem' is not pointing at a semaphore* OS_ERR_SEM_OVF If the post would cause the semaphore count to overflow.** Returns : The current value of the semaphore counter or 0 upon error.** Note(s) : This function is INTERNAL to uC/OS-III and your application should not call it.*************************************************************************************************************************/OS_SEM_CTR OS_SemPost (OS_SEM *p_sem, OS_OPT opt, CPU_TS ts, OS_ERR *p_err){ OS_OBJ_QTY cnt; OS_SEM_CTR ctr; OS_PEND_LIST *p_pend_list; OS_PEND_DATA *p_pend_data; OS_PEND_DATA *p_pend_data_next; OS_TCB *p_tcb; CPU_SR_ALLOC(); CPU_CRITICAL_ENTER(); p_pend_list = &p_sem->PendList; if (p_pend_list->NbrEntries == (OS_OBJ_QTY)0) { /* Any task waiting on semaphore? */ switch (sizeof(OS_SEM_CTR)) { case 1u: if (p_sem->Ctr == DEF_INT_08U_MAX_VAL) { CPU_CRITICAL_EXIT(); *p_err = OS_ERR_SEM_OVF; return ((OS_SEM_CTR)0); } break; case 2u: if (p_sem->Ctr == DEF_INT_16U_MAX_VAL) { CPU_CRITICAL_EXIT(); *p_err = OS_ERR_SEM_OVF; return ((OS_SEM_CTR)0); } break; case 4u: if (p_sem->Ctr == DEF_INT_32U_MAX_VAL) { CPU_CRITICAL_EXIT(); *p_err = OS_ERR_SEM_OVF; return ((OS_SEM_CTR)0); } break; default: break; } p_sem->Ctr++; /* No */ ctr = p_sem->Ctr; p_sem->TS = ts; /* Save timestamp in semaphore control block */ CPU_CRITICAL_EXIT(); *p_err = OS_ERR_NONE; return (ctr); } OS_CRITICAL_ENTER_CPU_EXIT(); if ((opt & OS_OPT_POST_ALL) != (OS_OPT)0) { /* Post message to all tasks waiting? */ cnt = p_pend_list->NbrEntries; /* Yes */ } else { cnt = (OS_OBJ_QTY)1; /* No */ } p_pend_data = p_pend_list->HeadPtr; while (cnt > 0u) { p_tcb = p_pend_data->TCBPtr; p_pend_data_next = p_pend_data->NextPtr; OS_Post((OS_PEND_OBJ *)((void *)p_sem), p_tcb, (void *)0, (OS_MSG_SIZE)0, ts); p_pend_data = p_pend_data_next; cnt--; } ctr = p_sem->Ctr;printf("rn point 1 rn"); OS_CRITICAL_EXIT_NO_SCHED();printf("rn point 2 rn"); if ((opt & OS_OPT_POST_NO_SCHED) == (OS_OPT)0) { OSSched(); /* Run the scheduler */ } *p_err = OS_ERR_NONE; return (ctr);} 我通过跟踪代码发现每次都卡死在OS_CRITICAL_EXIT_NO_SCHED();这一句。 如下图:建立TCP连接之后每次收发数据都会打出两组 point 1 point 2 可是只要网口调试助手主动断开连接,就会出现下面所示 point2没打出来就进入hardfault了。 |
|
|
|
|
|
|
|
STLINK当然是可以在线调试的,你就在线调试,出fault之后看看调用栈,应该可以发现问题点
另外注意,你的ucos是否移植正确 再一个,检查是否在中断中调用了不能调用的API函数 |
|
|
|
我上面的分析不可靠,后来用在线调试发现程序总是死在服务器进程里:
我觉得很可能是这种情况。 但是如果是这种情况该怎么避免呢? 原贴地址:http://www.openedv.com/posts/list/55903.htm |
|
|
|
另外我在官方FREE RTOS + LWIP的例程中找到一个开发板做服务器的例子:
用这个代码每次TCP客户端发送一组数据,作为服务器的开发板收到数据原样返回,然后它自己就主动断开连接了!这种情况下也不存在卡死的情况了 我试着把主动断开连接的代码删掉,然后问题依旧。 [AppleScript] 纯文本查看 复制代码 void another_server_netconn_thread(void *arg){ struct netconn *conn, *newconn; err_t err, accept_err; /* Create a new TCP connection handle */ conn = netconn_new(NETCONN_TCP); if (conn!= NULL) { /* Bind to port 80 (HTTP) with default IP address */ err = netconn_bind(conn, NULL, 1032); if (err == ERR_OK) { /* Put the connection into LISTEN state */ netconn_listen(conn); while(1) { /* accept any icoming connection */ accept_err = netconn_accept(conn, &newconn); if(accept_err == ERR_OK) { /* serve connection */ http_server_serve(newconn); /* delete connection */ netconn_delete(newconn); } } } else { /* delete connection */ netconn_delete(newconn); printf("can not bind netconn"); } } else { printf("can not create netconn"); }}[AppleScript] 纯文本查看 复制代码 void http_server_serve(struct netconn *conn) { struct netbuf *inbuf; err_t recv_err; char* buf; u16_t buflen; struct fs_file * file; 下面这段代码被我简化了,原本是发送网页的程序。 /* Read the data from the port, blocking if nothing yet there. We assume the request (the part we care about) is in one netbuf */ recv_err = netconn_recv(conn, &inbuf); if (recv_err == ERR_OK) { if (netconn_err(conn) == ERR_OK) {netbuf_data(inbuf, (void**)&buf, &buflen);netconn_write(conn,&buf,buflen,NETCONN_NOCOPY); } } /* Close the connection (server closes in HTTP) */ netconn_close(conn); /* Delete the buffer (netconn_recv gives us ownership, so we have to make sure to deallocate the buffer) */ netbuf_delete(inbuf);} |
|
|
|
谢谢分享
|
|
|
|
感谢电子发烧友网。
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2336 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2083 浏览 5 评论
2781 浏览 3 评论
2532 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2475 浏览 4 评论
546浏览 0评论
561浏览 0评论
327浏览 0评论
145浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-24 21:01 , Processed in 1.084177 second(s), Total 85, Slave 69 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号