首页 > 试题广场 >

在FreeRTOS中,任务所使用的堆栈空间超出分配给它的空间

[单选题]
在FreeRTOS中,任务所使用的堆栈空间超出分配给它的空间时,则会发生堆栈溢出,堆栈溢出可能修改超过合法访问地址范围外的数据,严重时会导致Hardfault令系统崩溃。所以在实际使用中,我们需要进行堆栈检测,关于FreeRTOS堆栈检测,下列说法错误的是()
  • 如果configCHECK_FOR_STACK_OVERFLOW不为0,需要用户提供一个堆栈检测钩子函数。
  • 当配置configCHECK_FOR_STACK_OVERFLOW==1,使用堆栈溢出检测方法 1。当配置configCHECK_FOR_STACK_OVERFLOW==2,使用堆栈溢出检测方法 2。
  • 当配置configCHECK_FOR_STACK_OVERFLOW==1时,能检测所有的堆栈溢出。
  • 当配置configCHECK_FOR_STACK_OVERFLOW==2时,在创建任务的时候会向任务堆栈填充一个已知的标记值。
官方文档:

堆栈溢出检测——方法 1

在 RTOS 内核使任务退出运行状态后,堆栈可能达到其最大(最深)值, 因为此时的堆栈会包含任务上下文。此时, RTOS 内核可以检查处理器堆栈指针是否仍处于有效堆栈空间内。如果堆栈指针 包含超出有效堆栈范围的值,则将调用堆栈溢出钩子函数。

此方法很快,但不能保证可以捕获所有堆栈溢出。将 configCHECK_FOR_STACK_OVERFLOW 设置 为 1 即可使用此方法。

堆栈溢出检测——方法 2

任务首次创建时,其堆栈会填充一个已知值。任务退出运行状态时, RTOS 内核可以检查最后 16 个字节是否处于有效堆栈范围内,以确保这些已知值 未被任务或中断活动所覆盖。如果这 16 个字节中的任何一个不再为初始值, 则调用堆栈溢出钩子函数。

这种方法比方法 1 效率低,但仍然相当快。它很可能会捕获堆栈溢出, 但仍无法保证能够捕获所有溢出。

将 configCHECK_FOR_STACK_OVERFLOW 设置为 2 即可使用此方法。

堆栈溢出检测——方法 3

将 configCHECK_FOR_STACK_OVERFLOW 设置为 3 即可使用此方法。

此方法仅适用于选定的端口。如果可用,该方法将启用 ISR 堆栈检查。 检测到 ISR 堆栈溢出时,会触发断言。请注意,在这种情况下不会调用堆栈溢出钩子函数, 因为它只针对任务堆栈,而不是针对 ISR 堆栈。


发表于 2025-08-16 08:51:00 回复(0)