5555|7

227

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

FreeRTOS中的任务堆栈溢出检测机制 [复制链接]

 

在FreeRTOS中,每个任务都拥有自己的堆栈,该堆栈的大小由创建任务时xTaskCreate函数的函数参数所决定。

但当任务所使用的堆栈空间超出分配给它的空间时,则会发生堆栈溢出,堆栈溢出可能修改超过合法访问地址范围外的数据,严重时会导致Hardfault令系统崩溃。

如何设定合理的任务堆栈大小以避免发生堆栈溢出问题呢?

首先我们需要根据任务函数运行过程中的理论堆栈使用最大值,在任务创建时设定一个合理的任务堆栈大小,并实际运行程序进行测试,来确保系统运行过程中不会发生堆栈溢出。

 

FreeRTOS中的任务堆栈溢出检测机制:

在FreeRTOS中,也提供了一些API函数用来检测任务堆栈的使用情况,例如:

uxTaskGetStackHighWaterMark (TaskHandle_t xTask)——返回自任务运行以来剩余可用堆栈空间的最小值

要使用上述函数,需要在FreeRTOSConfig.h头文件中使能宏“#define INCLUDE_uxTaskGetStackHighWaterMark      1”。该函数会返回任务运行过程中剩余可用堆栈空间的最小值,即任务运行过程中堆栈最大使用量时还剩余多少空间,如果函数返回0则说明可能发生了任务堆栈溢出。在应用中调用该函数可以帮助了解任务堆栈的一个实际使用情况。

FreeRTOS中还提供了两种堆栈溢出检测方式,需要在FreeRTOSconfig.h头文件中通过宏#define configCHECK_FOR_STACK_OVERFLOW  来进行选择使能:

两种检测方式在检测原理上存在一些差别,检测方式1是检测运行过程中的任务栈指针,检测方式2则是检测初始化后的数据在运行过程中是否被修改。

如果任务堆栈溢出检测函数检测到发生了堆栈溢出,则会调用对应的钩子函数(钩子函数需用户手动创建),用户可以在钩子函数中执行想要的操作例如打印发生错误的任务名等。

 

内核在什么时候执行任务堆栈溢出检测:

在FreeRTOS源码 tasks.c 文件中可以查到taskCHECK_FOR_STACK_OVERFLOW在 void vTaskSwitchContext( void )函数中被调用,也就是在任务上下文切换的时候做检测。从这点可以看出软件检测栈溢出的方式具有一定的滞后性,需要在任务发生上下文切换时才会进行,任务堆栈溢出时并不能马上检测到问题。

 

任务堆栈溢出检测存在的局限性:

如上文所述,只有在发生任务上下文切换时才会执行任务堆栈溢出检测,发生如下错误情形时则无法检测到了:

•     任务执行的过程中出现过栈溢出,但任务切换前栈指针又恢复到了正常水平。

•     任务栈末尾的 16 个字节没有用到,即不会被修改,但是任务栈已经溢出了

•     任务栈溢出后,把系统中的重要数据修改了导致系统直接进入Hardfault

FreeRTOS提供的堆栈溢出检测会引入任务上下文切换的开销,因此仅推荐在应用开发或者测试阶段使用。虽然存在一定的局限性,但大多常见情况下这些检测机制依然是非常实用的功能,可以帮助用户减少代码中的错误并提高应用程序代码的质量。

最新回复

1> 这个是事后检查机制,本身不一定能检查得到,      可以在某个任务里面把堆栈使用率统计出来,然后再预留余量,比如50% 2> 利用内存保护机制,取决于芯片了。用硬件MPU读写区域进行设置 (需要分区设计、OS内存保护机制等支持),违规就有 Mem Fault   详情 回复 发表于 2021-10-23 14:13
点赞 关注
个人签名

欢迎关注“麦克泰技术”

 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

如何设定合理的任务堆栈大小以避免发生堆栈溢出问题呢?

说来说去就是一个检测,任务堆栈溢出检测和在什么时候执行任务堆栈溢出检测

最后,又来个检测存在的局限性

怎么搞,,

 

点评

解决方案: 1、根据个人经验,先预估一个栈的大小; 2、通过打印栈剩余空间,查看任务最大内存使用了多少栈内存,合理调整任务栈的大小; 3、任务最大使用内存最好占任务栈的70%,这样可以在任务中增添一些  详情 回复 发表于 2021-10-15 15:53
 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 

有ide插件也挺方便的,比如IAR有freertos的堆栈插件。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

1942

帖子

2

TA的资源

版主

4
 
Jacktang 发表于 2021-10-15 15:21 如何设定合理的任务堆栈大小以避免发生堆栈溢出问题呢? 说来说去就是一个检测,任务堆栈溢出检测和在什 ...

解决方案:

1、根据个人经验,先预估一个栈的大小;

2、通过打印栈剩余空间,查看任务最大内存使用了多少栈内存,合理调整任务栈的大小;

3、任务最大使用内存最好占任务栈的70%,这样可以在任务中增添一些功能时也不会导致栈溢出;

点评

应该可行 合理调整任务栈的大小这个方法好    详情 回复 发表于 2021-10-21 07:19
 
 
 

回复

227

帖子

0

TA的资源

一粒金砂(高级)

5
 
Jacktang 发表于 2021-10-15 15:21 如何设定合理的任务堆栈大小以避免发生堆栈溢出问题呢? 说来说去就是一个检测,任务堆栈溢出检测和在什 ...

堆栈检测机制可以帮助我们优化调整任务栈的大小,但检测机制存在滞后性和局限,需要工程师更多的经验

 
个人签名

欢迎关注“麦克泰技术”

 
 

回复

6828

帖子

0

TA的资源

五彩晶圆(高级)

6
 
w494143467 发表于 2021-10-15 15:53 解决方案: 1、根据个人经验,先预估一个栈的大小; 2、通过打印栈剩余空间,查看任务最大内存使用 ...

应该可行

合理调整任务栈的大小这个方法好

 

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 

合理调整任务栈的大小这个方法好

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 

1> 这个是事后检查机制,本身不一定能检查得到,

     可以在某个任务里面把堆栈使用率统计出来,然后再预留余量,比如50%

2> 利用内存保护机制,取决于芯片了。用硬件MPU读写区域进行设置 (需要分区设计、OS内存保护机制等支持),违规就有 Mem Fault

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表