首页 > 系统相关 >freertos怎么查看任务内存是否溢出

freertos怎么查看任务内存是否溢出

时间:2024-08-13 10:38:45浏览次数:10  
标签:freertos 句柄 print uxTaskGetStackHighWaterMark 任务 内存 堆栈 uxHighWaterMark 溢出

1.允许堆栈检测 API 的使用

打开 FreeRTOSConfig.h 文件,找到宏 INCLUDE_uxTaskGetStackHighWaterMark 并将其值定为 1。

2.uxTaskGetStackHighWaterMark 函数的说明

点击查看代码
/*
*函数参数:xTask:需要检查的堆栈情况的任务句柄。将 xTask 设置为 NULL 的话检测的就是调用这个函数的任务堆栈情况。
*函数返回值:自创建 xTask 这个任务以来,已存在的最小可用堆栈空间量(以字为单位)。即返回的值是以字为单位的堆栈剩余量(例如,在 32 位机器上,返回值 1 表示任务堆栈中未使用的堆栈还剩余 4 个字节)。如果*返回值为零,则该任务可能堆栈已经溢出。 如果返回值接近零,则任务接近堆栈溢出。
*/
/*特别注意: freeRTOS中还有一个 uxTaskGetStackHighWaterMark2() ,这个是 uxTaskGetStackHighWaterMark() 的另外一个版本,它返回一个用户可定义的类型,主要用在一些 8 位架构上数据类型宽度有限制的MCU中。*/
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )
{
	TCB_t * pxTCB;
	uint8_t * pucEndOfStack;
	UBaseType_t uxReturn;
 
	pxTCB = prvGetTCBFromHandle( xTask );
 
	#if portSTACK_GROWTH < 0
		{
			pucEndOfStack = ( uint8_t * ) pxTCB->pxStack;
		}
	#else
		{
			pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;
		}
	#endif
 
	uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack );
 
	return uxReturn;
}

3.任务自己检测自己的堆栈情况

点击查看代码
void vTask1( void * pvParameters )   
{    
	UBaseType_t uxHighWaterMark;
 
	// 检测任务使用前的堆栈情况                         
	uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );        
 
	for( ;; )       
	{  
		...    // 其他代码
		...
		...                   
		vTaskDelay( 1000 );  
 
		// 检测任务运行之后的堆栈剩余情况          
		uxHighWaterMark = uxTaskGetStackHighWaterMark( NULL );        
	}    
}

4.使用任务单独检测任务的堆栈情况

点击查看代码
void TaskStackDetect_Task1( void * pvParameters )   
{    
	UBaseType_t uxHighWaterMark;
 
	for( ;; )       
	{        
		uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄1 ); 
		print(uxHighWaterMark);  
 
		uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄2 ); 
		print(uxHighWaterMark);      
 
		uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄3 ); 
		print(uxHighWaterMark);   
 
		...... 
 
		uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄n ); 
		print(uxHighWaterMark);      
 
		vTaskDelay( 1000 );                                                                
	}    
}

5.使用定时器检测任务堆栈

点击查看代码
void TaskStackDetect_Callback(TimerHandle_t pxTimer)  
{    
    UBaseType_t uxHighWaterMark;
    
    uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄1 ); 
    print(uxHighWaterMark);  
         
    uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄2 ); 
    print(uxHighWaterMark);      
         
    uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄3 ); 
    print(uxHighWaterMark);   
         
         ...... 
         
    uxHighWaterMark = uxTaskGetStackHighWaterMark( 任务句柄n ); 
    print(uxHighWaterMark);
}

标签:freertos,句柄,print,uxTaskGetStackHighWaterMark,任务,内存,堆栈,uxHighWaterMark,溢出
From: https://www.cnblogs.com/Charles-Hui/p/18356373

相关文章

  • C++:内存管理
    C++内存管理的概念        C语言内存管理方式(malloc/free)在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。new/delete                    new/d......
  • C语言和C++中的动态内存管理------malloc和free的区别
    引言:动态内存管理:需要根据具体情况来设定需要的内存大小,同时可能需要大于1Mbyte的连续空间。此时我们无法使用静态数组。原因是因为静态数据的开辟是在栈空间,其次栈空间的大小在连续分配时不能超过1Mbyte,因此引入了动态内存管理。C语言C语言中动态内存管理的有四个函数:mal......
  • 快速认识JVM,深入掌握类加载器、JVM内存空间、JVM垃圾回收机制和双亲委派机制。
    什么是JVM    JVM(JavaVirtualMchine)java虚拟机,主要作用就是将Java字节码文件解释为能被各种操作系统理解的机器码。JVM的三大功能    1.解释和运行:将字节码文件翻译为能被各种操作系统理解的机器码。    2.内存分配:给对象及其方法分配内存,管理......
  • 如何在栈上动态分配内存?
    alloca是一个非标准的函数,用于在栈上分配内存。与malloc不同,alloca分配的内存会在当前函数返回时自动释放,不需要也不能显式地调用free来释放它。这使得alloca在需要快速分配和释放小块内存时非常方便,但也带来了一些使用上的风险。1.基本用法#include<iostream>#in......
  • 从汇编层看64位程序运行——有惊无险的栈溢出
    大纲main进入时寄存器状态rbp:1rsp:df18分析过程离开时寄存器状态rbp:df10rsp:def8foo7进入时寄存器状态rbp:df10rsp:def8分析过程离开时寄存器状态rbp:df10rsp:def0foo进入时寄存器状态rbp:df10rsp:def8分析过程离开时寄存器状态rbp:df10rsp:def8main进入时寄......
  • 如何解决因内存不足导致的 iPhone 白苹果问题:原因解析与修复教程
    引言在使用iPhone的过程中,许多用户可能遇到过“白苹果”现象,即设备启动时只显示白色的Apple标志,却无法进入系统。这种情况通常让人感到困惑和担忧,尤其是当重要数据似乎无法访问时。本文将探讨内存不足导致iPhone白苹果的原因,并提供详细的修复教程,帮助你恢复设备正常运行......
  • Linux操作系统云主机中buffer和cache占用内存怎么办?
    问题描述系统长期运行后,free命令查看系统内存,发现剩余内存不足,大部分是buffer和cache。问题分析在Linux的内存管理中,buffer是Linux内存中的Buffercache。cache是Linux内存中的Pagecache。Buffercache:主要是当系统对块设备进行读写的时候,对块进行数据缓存的系统来使用,即......
  • lwIP——带操作系统(FreeRTOS)移植
    1.lwIP前期准备在程序工程中,我们在工程文件夹下创建了一个名为“lwip”的子文件夹。在“lwip”文件夹下,我们又创建了一个子文件夹:arch。arch文件夹用于存放lwIP系统的配置文件;2.添加lwIP源文件3.添加网卡驱动程序/*Includes------------------------------------......
  • C语言存在的问题——缓冲区溢出
    缓冲区溢出(BufferOverflow)是一种常见的安全漏洞,发生在当程序尝试向一个固定长度的缓冲区写入过多数据时。这可能会导致超出缓冲区分配的内存范围,覆盖相邻内存区域的数据,从而可能引起程序崩溃或安全漏洞。举个例子: #include<cstring>#include<iostream>voidvulnerableF......
  • JVM内存结构的划分
    5.3JVM内存结构的划分5.3.1栈(保存局部变量和方法调用的信息)栈也是线程私有的,在我们调用方法的时候,每调用一个方法,该方法就会进入栈中,当该方法执行完毕的时候就会从栈中移除。比如说现在要在main方法中调用A方法,在A方法中再调用B方法:但是,如果我们不停的调用方法,就会导致栈满......