完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[C] 纯文本查看 复制代码
#include "includes.h"/*********************************************************************************************************** 函数声明***********************************************************************************************************/static void vTaskTaskUserIF(void *pvParameters);static void vTaskLED(void *pvParameters);static void AppTaskCreate (void);/*********************************************************************************************************** 变量声明***********************************************************************************************************/static TaskHandle_t xHandleTaskUserIF = NULL;static TaskHandle_t xHandleTaskLED = NULL;/*********************************************************************************************************** 函 数 名: main* 功能说明: 标准c程序入口。* 形 参:无* 返 回 值: 无**********************************************************************************************************/ u8 *str = (u8*)"我就是esp8266!n";int main(void){ /* 硬件初始化 */ bsp_Init(); /* 关闭全局中断 */ __set_PRIMASK(1); /* 创建任务 */ AppTaskCreate(); /* 启动调度,开始执行任务 */ vTaskStartScheduler(); while(1) { };}/*********************************************************************************************************** 函 数 名: vTaskTaskUserIF* 功能说明: 接口消息处理,这里用作LED闪烁 * 形 参: pvParameters 是在创建该任务时传递的形参* 返 回 值: 无**********************************************************************************************************/static void vTaskTaskUserIF(void *pvParameters){ while(1) { bsp_LedToggle(1); esp8266_apsta_test(str); //esp8266发送数据 vTaskDelay(500); }}/*********************************************************************************************************** 函 数 名: vTaskLED* 功能说明: LED闪烁 * 形 参: pvParameters 是在创建该任务时传递的形参* 返 回 值: 无* 优 先 级: 2 **********************************************************************************************************/static void vTaskLED(void *pvParameters){ while(1) { bsp_LedToggle(2); vTaskDelay(200); }}/*********************************************************************************************************** 函 数 名: AppTaskCreate* 功能说明: 创建应用任务* 形 参:无* 返 回 值: 无**********************************************************************************************************/static void AppTaskCreate (void){ xTaskCreate( vTaskTaskUserIF, /* 任务函数 */ "vTaskUserIF", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 4, /* 任务优先级*/ &xHandleTaskUserIF ); /* 任务句柄 */ xTaskCreate( vTaskLED, /* 任务函数 */ "vTaskLED", /* 任务名 */ 512, /* 任务栈大小,单位word,也就是4字节 */ NULL, /* 任务参数 */ 2, /* 任务优先级*/ &xHandleTaskLED ); /* 任务句柄 */ __set_PRIMASK(0); //开启全局中断} [C] 纯文本查看 复制代码 void esp8266_apsta_test(u8 *p){ while(esp8266_send_cmd("AT+CIPSEND=15",">",20));//send a fixed-length data esp8266_send_data(p,"SEND OK",200);} 【问题描述】 问题出在第 68 行代码 esp8266_apsta_test(str); 工程中未加入 该函数,即未加入函数 esp8266_apsta_test(str) 到 vTaskTaskUserIF() 或 vTaskLED() 任务中 1)整个工程运行正常, LED 闪烁。 2.将函数 esp8266_apsta_test(str) 放入 vTaskTaskUserIF() 或 vTaskLED() 任务中 1)把任务延时函数 vTaskDelay(n) 注释掉,则该函数所在任务运行正常,其他任务不执行。不论 vTaskTaskUserIF() 或 vTaskLED() 哪个优先级高哪个低,但调试结果是高优先级任务并未打断低优先级任务而执行。 2)不注释任务延时函数 vTaskDelayt(n),从调试结果看所有的任务包括空闲任务依次执行一遍,然后系统就挂了。 【分析】 由未加入函数 esp8266_apsta_test(str) 前调试结果,LED 闪烁工作正常,说明操作系统任务切换无问题 由加入函数 esp8266_apsta_test(str) 后调试结果,推出函数 esp8266_apsta_test(str) 所在任务空间足够或系统栈空间不够 【已采取的解决办法】 改变栈空间大小,系统栈和任务栈改变均无作用,结果依旧 |
|
相关推荐
17个回答
|
|
1、打开INCLUDE_uxTaskGetStackHighWaterMark宏定义(FreeRTOS.h文件中),看下highwater值是多少,堆栈空间要够
2、esp8266_apsta_test(str)函数中是否有关闭全局中断的语句?或者占用CPU时间过长的操作 |
|
|
|
跟踪一下函数esp8266_apsta_test(str); //esp8266发送数据,看看是否被阻塞住,不能向下执行
|
|
|
|
没有阻塞语句,该函数执行完毕,执行到下一句延时函数内就挂了
|
|
|
|
esp8266_apsta_test(str)函数内没有关闭全局中断的语句,单步调试该函数是执行完毕后,执行下一句延时函数后挂了
|
|
|
|
esp8266_apsta_test这个函数代码发看下
|
|
|
|
[C] 纯文本查看 复制代码
/** * @brief : esp8266 APSTA-mode test * @param : to send data * @retval: none**/void esp8266_apsta_test(u8 *p){ while(esp8266_send_cmd("AT+CIPSEND=15",">",200));//send a fixed-length data esp8266_send_data(p,"SEND OK",200);}/** * @brief : to esp8266 send command * @param : cmd : to send cmd * ack :expected ack * waitime :wait time (unit:10ms) * @retval: 0:success (get expected ack) * 1:failure (overtime return)**/u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waitime){ u8 res=0; USART1_RX_STA=0; u1_printf("%srn",cmd); if(ack&&waitime) { while(--waitime) { delay_ms(10); if(USART1_RX_STA&0x8000) //receive a time data { if(esp8266_check_cmd(ack))break; //get expected ack USART1_RX_STA=0; } } if(waitime==0)res=1; } return res;}/** * @brief : check received ack after send cmd * @param : none * @retval: 0:success * 1:failure**/u8* esp8266_check_cmd(u8 *str){ char *strx = 0; if(USART1_RX_STA&0x8000) //receive a time data { USART1_RX_BUF[USART1_RX_STA&0x7FFF]=0;//add end char strx=strstr((const char*)USART1_RX_BUF,(const char*)str); } return (u8*)strx;}/** * @brief : to esp8266 send data * @param : cmd :to send data * ack :expected ack * waitime :wait time (unit:10ms) * @retval: 0:success (get expected ack) * 1:failure (overtime return)**/u8 esp8266_send_data(u8 *data,u8 *ack,u16 waitime){ u8 res=0; USART1_RX_STA=0; u1_printf("%s",data); if(ack&&waitime) { while(--waitime) { delay_ms(10); if(USART1_RX_STA&0x8000) //receive a time data { if(esp8266_check_cmd(ack))break; //get expected ack USART1_RX_STA=0; } } if(waitime==0)res=1; } return res;} |
|
|
|
while()这样的死等,建议弄个超时进去,不然出不来就完蛋了
|
|
|
|
一般是不能死等,但我的目的就是要将数据发送出去,如果未收到正确的响应,执行到下一句没有任何意义,所以此处必须要死等。
|
|
|
|
刚刚调试发现,在空闲任务中加入了打印函数,显示用户任务执行完一遍后,系统就一直待在了空闲任务,不停的打印提示信息
我将任务中的函数 esp8266_apsta_test(str) 放入临界段中,结果系统卡死在 while(esp8266_send_cmd("AT+CIPSEND=15",">",200)),同样的工程我移植 RTXOS 结果与 FreeRTOS 版本的一致,但在 RTXOS 版本中加入临界段任务锁,问题解决,经连续测试 1小时工作正常。 [C] 纯文本查看 复制代码 static void vTaskTaskUserIF(void *pvParameters){ while(1) {bsp_LedToggle(1);taskENTER_CRITICAL(); esp8266_apsta_test(str);taskEXIT_CRITICAL();vTaskDelay(500);}} |
|
|
|
你不能做重发啊,超过一定次数就认为失败,不然死等,在多任务中绝对死翘翘
|
|
|
|
我目前在跑FreeRTOS
|
|
|
|
将 main() 函数中有关任务的代码都注释掉,单独测试工程下的 esp8266_apsta_test(str) 函数,运行正常
[C] 纯文本查看 复制代码 int main(void){ /* 硬件初始化 */ bsp_Init(); /* 打开全局中断 */ __set_PRIMASK(0); // AppTaskCreate(); // vTaskStartScheduler(); while(1) { bsp_LedToggle(1); esp8266_apsta_test(str); delay_ms(500); } |
|
|
|
发送命令函数 u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waitime) 最后一个参数就防止死等而设置最大等待时长,我工程中写的是 200 也就是 2s,意思就是超过 2s后,本次放弃等下次继续请求。
|
|
|
|
硬件接口初始化完成后,用事件标志组做等待,全部任务的接口都初始化完成,才进入whlie循环去下图是我的做法
每一个任务在进入while之前都有这个,保证所有的硬件接口都初始化完成后才真正的跑任务的内容,这样可以避免一些由于其他硬件没准备好的情况而出现错误或者死机的现象 |
|
|
|
这是肯定的,硬件初始化完毕后,方可开始操作系统创建任务、开始任务调度。。。
|
|
|
|
|
|
问题已解决,延时部分对 systick 做了修改
|
|
|
|
只有小组成员才能发言,加入小组>>
772 浏览 0 评论
1148 浏览 1 评论
2527 浏览 5 评论
2858 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1061浏览 3评论
189浏览 2评论
453浏览 2评论
365浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
452浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 17:32 , Processed in 2.025559 second(s), Total 111, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号