首页 > 其他分享 >任务栈溢出检查

任务栈溢出检查

时间:2024-08-29 10:04:11浏览次数:7  
标签:pxCurrentTCB pulStack STACK configCHECK 任务 ulCheckValue OVERFLOW 溢出检查

方法1.栈顶地址是否小于等于栈底

在FreeRTOSConfig.h中,配置

点击查看代码
#define configCHECK_FOR_STACK_OVERFLOW 1

在StackMacros.h文件中可以看到如下代码

点击查看代码
#if( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )

	/* Only the current stack state is to be checked. */
	#define taskCHECK_FOR_STACK_OVERFLOW()																\
	{																									\
		/* Is the currently saved stack pointer within the stack limit? */								\
		if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack )										\
		{																								\
			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\
		}																								\
	}

#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */

方法2.栈底的4个word的在任务创建赋值的初始值,是否被修改

在FreeRTOSConfig.h中,配置

点击查看代码
#define configCHECK_FOR_STACK_OVERFLOW 2

在StackMacros.h文件中可以看到如下代码

点击查看代码
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )

	#define taskCHECK_FOR_STACK_OVERFLOW()																\
	{																									\
		const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;							\
		const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5;											\
																										\
		if( ( pulStack[ 0 ] != ulCheckValue ) ||												\
			( pulStack[ 1 ] != ulCheckValue ) ||												\
			( pulStack[ 2 ] != ulCheckValue ) ||												\
			( pulStack[ 3 ] != ulCheckValue ) )												\
		{																								\
			vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pxCurrentTCB->pcTaskName );	\
		}																								\
	}

#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */

栈溢出处理函数,可在main.c中定义如下:

点击查看代码
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
{
	dbg_printf("Stack Overflow!!!\n");
	while(1);
    // 处理栈溢出的代码
    // 例如:记录错误,重启任务等
}

标签:pxCurrentTCB,pulStack,STACK,configCHECK,任务,ulCheckValue,OVERFLOW,溢出检查
From: https://www.cnblogs.com/Charles-Hui/p/18386032

相关文章

  • 你知道大模型能做哪些事情吗?——大模型的任务类型以及应用场景
    “不熟悉大模型技术与业务场景的情况下,怎么构建一款大模型的产品**”**现在大模型技术发展的日新月异,但市面上关于大模型的教程基本上都集中在技术实现以及基础使用。不知道你是否思考过,如果自己想用大模型解决某个领域的问题应该怎么做?‍‍‍大模型能解决那些问题,该怎......
  • chapter15------任务切换
    任务切换的基本方式(简介)协同式从一个任务切换到另一个任务时,需要当前任务主动地请求暂时放弃执行权,或者在通过调用门请求操作系统服务时,由操作系统将控制转移到另一个任务任务的切换取决于每个任务的“自律性”抢占式可以安装一个定时器中断,并在中断服务程序中实施任务......
  • Android开发 - Runnable 类任务接口定义与后台任务待办解析
    什么是RunnableRunnable接口是用来定义一个任务的接口,这个任务可以在线程中执行。通俗地说,它就像一个“待办事项”,用来描述需要在一个单独的线程中完成的工作。Runnable接口非常简单,只定义了一个方法:run()。当一个类实现了Runnable接口时,它需要提供这个方法的实现,里面写上......
  • Apache DolphinScheduler中处理任务/告警/事件相关核心思路曝光
    最近在看ApacheDolphineScheduler,发现DolphinScheduler在处理任务时,通过先将任务快速的存储在数据库中,然后基于对应的Task,将Task放入队列中,然后将Task进行快速消费的思路。这种模型在很多框架中,都有体现。我们知道在Master模块时处理任务的核心模块,而API模块主要是界面中操作......
  • java增加注解实现异步执行任务
    1.首先启动类增加注解@EnableAsync2.增加configpackagecom.xxx.config;importorg.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.A......
  • 异步任务的艺术:Bull应用详解
    Bull是一个强大的Node.js库,它基于Redis构建,为异步任务队列提供了简单而强大的解决方案。它支持多种任务处理模式,包括延迟任务、重复任务和优先级队列,使得发送电子邮件、生成报告或处理图像等耗时操作变得轻而易举。Bull的易用性、灵活性和稳定性使其成为现代应用程序中......
  • Win11如何找回熟悉的开始菜单、任务栏和右键菜单
    背景公司政策满3年可以换新电脑,前段时间申请了下,到手后发现是Win11系统,配置翻倍,欣然接受,把一些常用的软件都安装上,但是,用了一段时间后,发现右键刷新要点击2次,开始菜单找东西也完全靠搜索,任务栏不可定义了,和以前常用的右下角日历小工具不兼容,如果要和这些用惯好多年的操作sayg......
  • Rsync实现定时自动同步备份任务
     rsync全量备份 增量备份.Rsync等价cp,scp,rm,ls四个命令功能.是一款实现全量及增量复制同步的软件工具.scp命令解释:#1,从远程服务器中下载数据文件到本地主机:scp root@host1:/tmp/test1 /tmp#2,从远程服务器中拷贝目录文件到本地主机下面scp  -rroot@host1......
  • 【项目实践】CompletableFuture异步编排在多任务并行执行中的使用
    【项目实践】CompletableFuture异步编排在多任务并行执行中的使用一、单次请求处理多任务的场景        在实际项目中,我们经常会遇到一些比较复杂的查询,需要给前端响应一个内容量较大的响应结果。例如在租房系统的app中,点击具体的某个房间查看详情,需要后端将这个房间的......
  • Bi-MTDP:通过二值网络加速多任务密集预测,又快又提点 | CVPR 2024
    论文提出二值化多任务密集预测器Bi-MTDP,通过二值神经网络(BNNs)显著加速多任务密集预测模型,同时保持甚至提高模型性能。为了避免信息严重退化而导致二值化带来性能下降,论文引入了深度信息瓶颈层,在前向传播时强制要求下游任务表示满足高斯分布;此外,还引入知识蒸馏机制来纠正反向传播......