野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15600|回复: 4

求助帖:ESP8266在FreeRTOS出现一个器奇怪的问题

[复制链接]
发表于 2016-10-20 17:48:28 | 显示全部楼层 |阅读模式
本帖最后由 yenhgng001 于 2016-10-20 17:49 编辑

本小白在把ESP8266放进FreeRTOS时遇到了一些小问题,找了很久就是找不到问题出在哪里
以下是main函数

  1. int main(void)
  2. {
  3. LED_Init();
  4. USART1_Init();
  5. ESP8266_Init();

  6. xTaskCreate(vTask_LED_RED   ,"Task LED RED"   ,100 ,NULL,2,NULL);
  7. xTaskCreate(vTask_LED_BLUE  ,"Task LED BLUE"  ,100 ,NULL,1,NULL);
  8. xTaskCreate(vTask_ESP8266_Test,"Task ESP8266 Test",1000,NULL,3,NULL);

  9. vTaskStartScheduler();
  10. }
复制代码

在不运行第三个ESP8266的任务的情况下,前两个LED任务完全没问题

以下是vTask_ESP8266_Test()函数

  1. void vTask_ESP8266_Test(void *vParameters){
  2. char* respond;
  3. ESP8266_Start();

  4. while(1){
  5.   ESP8266_SendString ( ENABLE, "GET http://baidu.com HTTP/1.0\r\n\r\n\r\n", 0, Single_ID_0 );
  6.   printf("Send GET Request Done!\n");
  7.   respond = ESP8266_ReceiveString(ENABLE);
  8.   printf("%s",respond);
  9.   vTaskDelay(5000/portTICK_RATE_MS);
  10. }
  11. }<div>

  12. </div>
复制代码
ESP8266是按照野火裸机例程写的

这是ESP8266_Start()函数

  1. void ESP8266_Start(){

  2. printf ( "\r\n正在配置 ESP8266 ......\r\n" );

  3. ESP8266_CH_ENABLE();

  4. #if DEBUG
  5. printf("CH Enable Done!\n");
  6. #endif

  7. ESP8266_AT_Test ();

  8. #if DEBUG
  9. printf("AT Test Done!\n");
  10. #endif

  11. ESP8266_Net_Mode_Choose ( STA );

  12. #if DEBUG
  13. printf("Choose STA Net Mode Done!\n");
  14. #endif
  15.   while ( ! ESP8266_JoinAP ( AP_SSID, AP_PASSWORD ) );

  16. #if DEBUG
  17. printf("Join AP Done!\n");
  18. #endif

  19. ESP8266_Enable_MultipleId ( DISABLE );

  20. #if DEBUG
  21. printf("Disable MultipleId Done!\n");
  22. #endif

  23. while ( ! ESP8266_Link_Server ( enumTCP, TcpServer_IP, TcpServer_Port, Single_ID_0 ) );

  24. #if DEBUG
  25. printf("Link Server Done!\n");
  26. #endif

  27. while ( ! ESP8266_UnvarnishSend () );

  28. #if DEBUG
  29. printf("Start UnvarnishSend Done!");
  30. #endif

  31. printf ( "\r\n配置 ESP8266完毕\r\n" );
  32. }
复制代码

下面是中断函数

  1. void USART3_IRQHandler ( void )
  2. {
  3. uint8_t ucCh;

  4. if ( USART_GetITStatus ( ESP8266_USARTx, USART_IT_RXNE ) == SET )
  5. {
  6.   ucCh  = USART_ReceiveData( ESP8266_USARTx );
  7.   
  8.   if ( strEsp8266_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )                  
  9.    strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ++ ]  = ucCh;
  10. }
  11.    
  12. if ( USART_GetITStatus( ESP8266_USARTx, USART_IT_IDLE ) == SET )                                       
  13. {
  14.     strEsp8266_Fram_Record .InfBit .FramFinishFlag = 1;
  15.   
  16.   ucCh = USART_ReceiveData( ESP8266_USARTx );                                                   

  17.   ucTcpClosedFlag = strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "CLOSED\r\n" ) ? 1 : 0;
  18.   }
  19. }
复制代码

程序运行后一直到vTask_ESP8266_Test()函数的while循环里就开始出问题了,第一次发送GET请求是没有问题的,也能接收到响应,但是第二次就会卡住,连LED的也不闪了,好像整个系统都卡住了
下面是LED的任务

  1. void vTask_LED_RED(void *vParameters){
  2. while(1){
  3.   LED_Switch(LED_RED,TURN_OFF);
  4.   printf("LED_RED is OFF\n");
  5.   vTaskDelay(1000/portTICK_RATE_MS); //Delay 1 sec
  6.   LED_Switch(LED_RED,TURN_ON);
  7.   printf("LED_RED is ON\n");
  8.   vTaskDelay(1000/portTICK_RATE_MS);
  9. }
  10. }
  11. void vTask_LED_BLUE(void *vParameters){
  12. while(1){
  13.   LED_Switch(LED_BLUE,TURN_ON);
  14.   printf("LED_BLUE is ON\n");
  15.   vTaskDelay(1000/portTICK_RATE_MS);
  16.   LED_Switch(LED_BLUE,TURN_OFF);
  17.   printf("LED_BLUE is OFF\n");
  18.   vTaskDelay(1000/portTICK_RATE_MS);
  19. }
  20. }
复制代码


下面是串口打印的数据

  1. 正在配置 ESP8266 ......
  2. CH Enable Done!
  3. LED_RED is OFF
  4. LED_BLUE is ON
  5. LED_RED is ON
  6. LED_BLUE is OFF
  7. AT Test Done!
  8. LED_RED is OFF
  9. LED_BLUE is ON
  10. LED_RED is ON
  11. LED_BLUE is OFF
  12. Choose STA Net Mode Done!
  13. LED_RED is OFF
  14. .......  //这里各种 ON 和 OFF最多,可能是加入AP比较耗时间
  15. LED_BLUE is OFF
  16. Join AP Done!
  17. LED_RED is OFF
  18. LED_BLUE is ON
  19. Disable MultipleId Done!
  20. LED_RED is ON
  21. LED_BLUE is OFF
  22. LED_RED is OFF
  23. LED_BLUE is ON
  24. LED_RED is ON
  25. LED_BLUE is OFF
  26. LED_RED is OFF
  27. LED_BLUE is ON
  28. Link Server Done!
  29. LED_RED is ON
  30. LED_BLUE is OFF
  31. Start UnvarnishSend Done!
  32. 配置 ESP8266 完毕
  33. Send GET Request Done!
  34. Recive Function In!
  35. Recive Function set Done!      //第一次就没问题
  36. Recive Function while Done!
  37. add \0 Done!
  38. Recive Function Finished!
  39. CLOSED
  40. HTTP/1.1 200 OK
  41. Server: nginx
  42. Date: Thu, 20 Oct 2016 09:44:46 GMT
  43. Content-Type: text/html
  44. Content-Length: 163
  45. Last-Modified: Thu, 25 Jun 2015 03:08:19 GMT
  46. Connection: close
  47. Accept-Ranges: bytes
  48. <html>
  49.     <head>
  50.         <meta http-equiv="refresh" content="0; url=http://hndnserror7.wo.com.cn:8080/sj/index.html" />
  51.     </head
  52.     <body>
  53.     </body>
  54. </html>
  55. LED_RED is OFF
  56. LED_BLUE is ON
  57. LED_RED is ON
  58. LED_BLUE is OFF
  59. LED_RED is OFF
  60. LED_BLUE is ON
  61. LED_RED is ON
  62. LED_BLUE is OFF
  63. LED_RED is OFF
  64. LED_BLUE is ON
  65. Send GET Request Done!
  66. Recive Function In!
  67. Recive Function set Done!    //问题就出在这了,这是第二次发送

复制代码

Recive Function In!
Recive Function set Done!这几句是在char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx )函数里

  1. char * ESP8266_ReceiveString ( FunctionalState enumEnUnvarnishTx ){

  2. char * pRecStr = 0;

  3. printf("Recive Function In!\n");

  4. strEsp8266_Fram_Record .InfBit .FramLength = 0;
  5. strEsp8266_Fram_Record .InfBit .FramFinishFlag = 0;

  6. printf("Recive Function set Done!\n");

  7. while ( ! strEsp8266_Fram_Record .InfBit .FramFinishFlag );
  8. printf("Recive Function while Done!\n");
  9. strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '\0';
  10. printf("add \\0 Done!\n");

  11. if ( enumEnUnvarnishTx )
  12.   pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  13. else
  14. {
  15.   if ( strstr ( strEsp8266_Fram_Record .Data_RX_BUF, "+IPD" ) )
  16.    pRecStr = strEsp8266_Fram_Record .Data_RX_BUF;
  17. }
  18. printf("Recive Function Finished!\n");
  19. return pRecStr;
  20. }
复制代码




回复

使用道具 举报

发表于 2016-10-20 19:31:17 | 显示全部楼层
估计是卡在esp8266的中断里了,连调试都卡住
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-20 23:17:04 | 显示全部楼层
随风 发表于 2016-10-20 19:31
估计是卡在esp8266的中断里了,连调试都卡住

后来我尝试了一下,发现是因为我第二次发出去的请求没有响应,导致一直死循环等待响应,而esp8266的任务又是最高优先级,所以一直处于死循环,其他任务得不到执行。我尝试将请求发送到超级终端,然后手动响应一些东西(随便写点什么发过去),结果系统收到响应之后又继续正常执行了。或者调整优先级,把LED调的比ESP8266高,这样esp的死循环就不会影响LED了
回复 支持 反对

使用道具 举报

发表于 2016-10-21 08:53:08 | 显示全部楼层
yenhgng001 发表于 2016-10-20 23:17
后来我尝试了一下,发现是因为我第二次发出去的请求没有响应,导致一直死循环等待响应,而esp8266的任务 ...

把它设置成最高优先级是正确的,接收数据肯定比亮LED灯重要。
只要在循环等待的时候,加上系统的延时,这样的话,其它任务就有机会执行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-21 10:42:59 | 显示全部楼层
flyleaf 发表于 2016-10-21 08:53
把它设置成最高优先级是正确的,接收数据肯定比亮LED灯重要。
只要在循环等待的时候,加上系统的延时, ...

好的,多谢
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 06:30 , Processed in 0.034946 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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