解决FreeRTOS程序跑不起来,打印调试却提示“Error:..\FreeRTOS\port\RVDS\ARM_CM3\port.c,244“的方法

前言

今天来分享一个不会造成程序编译报错,但会使程序一直跑不起来,并且通过调试会发现有输出错误提示的错误例子分析,话不多说,我们就直接开始分析~

首先,我们说过这个例子在编译时候没有明示的错误提示,也可以说没有语法和逻辑之类的错误,应该是程序哪里写的有不规范的地方造成的。我们先来分析一下当时的情况~

错误发现

当时发现程序跑不起来,依然是从LED呼吸灯看出来的,然后通过debug来一步一步锁定错误,并且配合串口调试信息输出来查看断言。发现程序一开始是进行下去的了,然后发现执行到一个函数的时候,程序就跑飞了。发现此时调试窗口输出提示:"Error:...\FreeRTOS\port\RVDS\ARM_CM3\port.c,244" 。如下图所示:

同时通过行数发现是这句断言产生的调试信息,configASSERT( uxCriticalNesting == ~0UL );,可以从以下代码看出,程序是执行了任务退出错误的函数,那为什么会执行到该函数呢?我们就回退到进入该函数前,看看程序在干什么?代码完整输出如下:

c 复制代码
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( ;; );
}

错误原因

我们回退回去发现,当时进入函数前程序在执行一个任务,执行完之后就进入到那个函数去,仔细看了一遍,发现原来是那个任务忘记添加了while,导致你还没有调度,那个任务就退出来了,所以才会提示你任务退出有错误

解决方法

知道了错误原因,解决这个错误也就很简单了,只需要将相应的while加上去即可~

这个错误可能在大家刚开始使用freertos时候最容易遇到,大家学习时候看例子可能都会想到这个while,但是有时候自己去写一个任务时候,可能就会忘记添加上去,就有可能会有这个情况出现。

所以有时候细心还是很重要的,这里分享出来也是希望帮助到有同样情况的小伙伴。

好了,今天分享就到这里了。

本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。

另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞和收藏,谢谢~

相关推荐
你家人养牛4 小时前
numworks移植记录:7.移植LCD驱动——添加到numworks中
嵌入式
你家人养牛4 小时前
numworks移植记录:10.编译问题汇总与解决方案
嵌入式
你家人养牛4 小时前
numworks移植记录:11.编译问题汇总与解决方案(二)
嵌入式
你家人养牛4 小时前
numworks移植记录:5.从 Makefile 到 CMake —— 提取模块依赖并集成到 ESP-IDF
嵌入式
你家人养牛4 小时前
numworks移植记录:4.使用 CLion + ESP-IDF 编译,添加模块并集成编译出 bin 文件
嵌入式
你家人养牛4 小时前
numworks移植记录:8.按键扫描——用74HC595和74HC165扩展GPIO实现矩阵键盘
嵌入式
序安InToo7 天前
第6课|注释与代码风格
后端·操作系统·嵌入式
悠哉悠哉愿意13 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
一个人旅程~13 天前
如何用命令行把win10/win11设置为长期暂停更新?
linux·windows·经验分享·电脑
Lester_110113 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制