UDP调用发送队列API导致错误9

donsbin
Posts: 2
Joined: Wed Jun 15, 2016 8:20 pm

UDP调用发送队列API导致错误9

Postby donsbin » Wed Jun 15, 2016 8:33 pm

ESP8266 RTOS V1.4 ,目前只添加一个任务,UDP一旦监听接收到数据后,如果调用发送队列的API,就会导致复位 :(

Code: Select all


xQueueHandle MsgQueue; /*创建队列句柄*/
MsgQueue = xQueueCreate(2,sizeof(u16)); //

/******************************************************************************
 * FunctionName : udpServer_Task
 * Description  : UDP任务机制
 * Parameters   :
 * Returns      :
 * Remarks      : 通过队列发送消息
*******************************************************************************/
void udpServer_Task(void *pvParameters)
{
   LOCAL int32 sock_fd;
   LOCAL int nNetTimeout = 1000; //3s
   u8 ret,scanNum = 0;
   
   u16 MsgType = 0xFF;
   struct sockaddr_in server_addr;
   struct sockaddr_in remoteAddr;
   printf("create UDP server!\r\n");
   char fromlen;
   
   for(;;)
   {   
   
      while(1)
      {
         vTaskDelay(3000/portTICK_RATE_MS);
         if (wifi_station_get_connect_status() == STATION_GOT_IP)//
            break;
      }
   
      memset(&server_addr, 0, sizeof(server_addr));
      server_addr.sin_family = AF_INET;
      server_addr.sin_addr.s_addr = INADDR_ANY;
      server_addr.sin_port = htons(6666);
      server_addr.sin_len = sizeof(server_addr);
      do{
         sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
         if (sock_fd == -1)
         {
            printf("ESP8266 UDP task > failed to create sock!\n");
            vTaskDelay(1000/portTICK_RATE_MS);
         }
      }while(sock_fd == -1);
      
      printf("ESP8266 UDP task > socket OK!\n");
      do{
         ret = bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
         if (ret != 0)
         {
            printf("ESP8266 UDP task > captdns_task failed to bind sock!\n");
            vTaskDelay(1000/portTICK_RATE_MS);
         }
      }while(ret != 0);
      
      printf("ESP8266 UDP task > bind OK!\n");

      
      
      memset(&remoteAddr, 0, sizeof(remoteAddr));
      setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, /*0*/&nNetTimeout,sizeof(int));
      fromlen = sizeof(struct sockaddr_in);
      while(1)
      {      
         vTaskDelay(10 / portTICK_RATE_MS);
         char *udp_msg = (char *)zalloc(256);
         memset(&remoteAddr, 0, sizeof(remoteAddr));
         fromlen = sizeof(struct sockaddr_in);
         ret = recvfrom(sock_fd, (uint8 *)udp_msg, 256, 0,(struct sockaddr*)&remoteAddr,(socklen_t *)&fromlen);
         if (ret > 0 && ret != 0xFF)
         {
            

            MsgType = 0xFF;
            
            if(xQueueSendToBack( MsgQueue, ( void *)&MsgType, 0 ) != pdPASS)/* UDP接收到数据后发送消息队列就会出现程序错误 */
               printf("send channel msg error!~\r\n");
            else
               printf("send channel msg success~\r\n");
         }
         free(udp_msg);
         
         //if(xQueueSendToBack( MsgQueue, ( void *)&MsgType, 0 ) != pdPASS)/* 没有收到数据调用不会出错 */
         //   ;
      }
      close(sock_fd);      
   }
}

donsbin
Posts: 2
Joined: Wed Jun 15, 2016 8:20 pm

Re: UDP调用发送队列API导致错误9

Postby donsbin » Thu Jun 16, 2016 8:28 am

如果没有接收到UDP数据发送消息队列也没问题的
或者接收到数据不调用发送消息队列的API
这个实在是找不到问题。UDP代码按照官方RTOS手册写的 :|

Who is online

Users browsing this forum: No registered users and 13 guests