OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2984|回复: 1

ucosii 执行完task后死机,请大佬帮忙看看什么原因

[复制链接]

3

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2019-10-24
在线时间
34 小时
发表于 2022-3-8 11:00:39 | 显示全部楼层 |阅读模式
用正点原子的扩展程序,网络实验9 NETCONN_TCP服务器,但server建立好后,当有连接的时候,获得IP地址,并创建一个task,发现当task执行完时,系统死机,不知道什么原因,大佬帮忙看下是什么问题。发现在tcp_test执行完后就死机了。

static void tcp_server_thread(void *arg)
{
        OS_CPU_SR cpu_sr;
        u32 data_len = 0;
        struct pbuf *q;
        err_t err,recv_err;
        u8 remot_addr[4];
        struct netconn *conn, *newconn;
        static ip_addr_t ipaddr;
        static u16_t                         port;
        uint8_t clientnumindex=0;       
       
        client_init();
        LWIP_UNUSED_ARG(arg);
        conn = netconn_new(NETCONN_TCP);  //′′½¨ò»¸öTCPá′½ó
        netconn_bind(conn,IP_ADDR_ANY,TCP_SERVER_PORT);  //°ó¶¨¶Ë¿ú
        netconn_listen(conn);  //½øèë¼àìyÄ£ê½
        conn->recv_timeout = 10;  //½ûÖ1×èèûÏß3ì μè′y10ms
       
        //printf("Server is ready\r\n");
        while (1)
        {
                err = netconn_accept(conn,&newconn);  //½óêÕᬽóÇëÇó
                if(err==ERR_OK) newconn->recv_timeout = 10;
               
               
                if (err == ERR_OK)    //′|àíDÂᬽóμÄêy¾Y
                {
                        if(set_client((void *)&newconn,&clientnumindex) != ERR_OK)
                                {                                         
                                        netconn_close(newconn);                 
                                        netconn_delete(newconn);               
                                }
                                else
                                {
                                //        printf("clientnumindex=%d\r\n",clientnumindex);
                                        create_task_handle_client(newconn,clientnumindex);
                                }
                }

                delay_ms(10);
        }
        //        printf("Server is exit\r\n");
}

static int task_parameter=0;
void create_task_handle_client(struct netconn *newconn,int clientnumindex)
{
                        OS_CPU_SR cpu_sr;
                 // uint8_t index=0;
//            printf("entry create_task_handle_client %d\r\n",clientnumindex);
                        clientad.client[clientnumindex]=newconn;                            
                        clientad.state[clientnumindex]=1;   
                        task_parameter =clientnumindex;
                        //index =clientnumindex;
//                        printf("addr:0x%p",&clientnumindex);
                                        //clientad.client_taskid[clientnumindex] = osThreadCreate(osThread(myTaskClient),  (void *)clientnumindex);
                        OS_ENTER_CRITICAL();        //1ØÖD¶Ï                       
//                        clientad.client_taskid[clientnumindex] =  OSTaskCreateExt(tcp_server_datahandle_thread,(void*)&clientnumindex,(void*)&clientad.TCPSERVER_HANDLE_TASK_STK[clientnumindex][TCPSERVER_HANDLE_STK_SIZE-1],clientad.prio[clientnumindex],clientad.prio[clientnumindex],(OS_STK*)&clientad.TCPSERVER_HANDLE_TASK_STK[clientnumindex][TCPSERVER_HANDLE_STK_SIZE-1],TCPSERVER_HANDLE_STK_SIZE,NULL,0);
                  clientad.client_taskid[clientnumindex] =OSTaskCreate(/*tcp_server_datahandle_thread*/tcp_test, (void*)&task_parameter,(OS_STK*)&clientad.TCPSERVER_HANDLE_TASK_STK[clientnumindex][TCPSERVER_HANDLE_STK_SIZE-1],clientad.prio[clientnumindex]); //′′½¨TCP·tÎñÆ÷Ïß3ì
                        OS_EXIT_CRITICAL();                //¿aÖD¶Ï

                                       
                        if(clientad.client_taskid[clientnumindex]!=0)
                        {
//                                printf("Failed to create the recv thread with id: %d\n",clientad.client_taskid[clientnumindex] );
                        }
                        else
                        {
//                                printf("create the recv thread with id: %x\n",(int)(clientad.client_taskid[clientnumindex]));
                        }
}

static void tcp_test(void *arg)
{
                OS_CPU_SR cpu_sr;
        int i=0;
        for(i=0;i<100;i++)
        {
                        OSTimeDlyHMSM(0,0,0,100);
        }
        OS_ENTER_CRITICAL();        //1&#216;&#214;D&#182;&#207;               
        printf("exit tcp test\r\n");
        OS_EXIT_CRITICAL();                //&#191;a&#214;D&#182;&#207;
        OS_Sched();
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2019-10-24
在线时间
34 小时
 楼主| 发表于 2022-3-10 11:27:44 | 显示全部楼层
问题找到了,任务完成的时候,要把任务删除。
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 19:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表