扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

prvTaskExitError异常退出,FreeRTOS报错分析

03/16 16:22
285
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

prvTaskExitError退出,FreeRTOS启动失败,原因分析

FreeRTOS报错信息如下:

Error:..srcfreertosportableRVDSARM_CM4Fport.c,233

根据断言信息,报错位置为port.c文件第233行,查看源代码

static void prvTaskExitError(void)
{
/* A function that implements a task must not exit or attempt to return to
* its caller as there is nothing to return to.  If a task wants to exit it
* should instead call vTaskDelete( NULL ).
*
* Artificially force an assert() to be triggered if configASSERT() is
* defined, then stop here so application writers can catch the error. */
configASSERT( uxCriticalNesting ==~0UL);
portDISABLE_INTERRUPTS();

for(;;)
{
}
}

发现是执行了prvTaskExitError函数,再根据官方文件注释,FreeRTOS中规定,任务不能退出,如果要退出只能调用vTaskDelete( NULL ),否则就会异常报错,根据这个提示,检查各个任务,是不是有异常退出。

如果有多个任务,可以对在prvTaskExitError函数中增加调试代码,打印任务名称,如下:

static void prvTaskExitError(void)
{
/* A function that implements a task must not exit or attempt to return to
* its caller as there is nothing to return to.  If a task wants to exit it
* should instead call vTaskDelete( NULL ).
*
* Artificially force an assert() to be triggered if configASSERT() is
* defined, then stop here so application writers can catch the error. */
TaskHandle_t xTask=xTaskGetCurrentTaskHandle();
const        char*pcTaskName =pcTaskGetName(xTask);
printf("Error:Task %s exited unexpectedly!rn",pcTaskName);

configASSERT( uxCriticalNesting ==~0UL);
portDISABLE_INTERRUPTS();

for(;;)
{
}
}

再次运行,即可打印出任务名称,从而具体分析某个任务:

Error:Task ftp_server exited unexpectedly!
Error:..srcfreertosportableRVDSARM_CM4Fport.c,237

可以看出,导致异常退出的任务是ftp_server,分析ftp_server任务,发现是有return返回的地方,导致任务异常退出了。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

公众号:物联网思考;主要记录、分享、思考开发中遇到的技术小细节,涉及嵌入式单片机、C语言、传感器、低功耗物联网等。偶尔也可能是程序员健康、职场潜规则、生活思考、行业讨论。