堆栈使用
维持的每个任务,都有它自己的堆栈。任务堆栈占用的内存,当任务创建时自动分配了;堆栈的尺寸参数通过xTaskCreate()?API确定。堆栈溢出是常见事件,由应用程序不确定引起的。
FreeRTOS.org?因此提供了提供了两个可供选择的机制,可用来协助察觉和纠正这种事件发生。使用的选项由
configCHECK_FOR_STACK_OVERFLOW 配置常量配置.
注意,这些选项仅适用于架构为内存印象不是分割的和堆栈从下到上增长。另外,一些处理器在内核溢出检测发生前能产生错误或异常来反映堆栈恶化。应用程序,必须提供堆栈溢出钩子函数,即configCHECK_FOR_STACK_OVERFLOW设置为1。钩子函数必须调用?vApplicationStackOverflowHook(),形式如下:
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
pxTask和pcTaskName参数传到钩子函数,处理和名字分别是损坏的任务。注意,根据溢出的严格性,这些参数本身会毁坏。
堆栈溢出检测引入上下文切换,这些推荐在开发和测试阶段使用。
堆栈溢出探测 —— 方法1
它是在内核脱离运行状态切换任务(当任务包含上下文任务)后,堆栈达到最大(最深)值。在这一点上,内核能够检测,处理器堆栈指针保留在有效的堆栈范围内。调用堆栈溢出钩子函数时,堆栈指针包含无效值。
这是个快速的方法,但不能确保能捕捉到堆栈溢出.如果使用这种方法,设置configCHECK_FOR_STACK_OVERFLOW为1.
堆栈溢出探测 ——方法2
当任务第一次创建它自己的堆栈——由已知的值填充。当脱离运行状态,任务切换时,内核检测最后16字节(在有效堆栈的范围内),来确保已知值不被活动的任务或中断所覆盖。调用堆栈溢出钩子函数,在初始值中不保留这16字节。
方法没有第一个方法效率高,但那是仍然很快。它可能捕捉到堆栈溢出,但是不能确保捕捉到。
与方法1结合使用这个方法,可设置configCHECK_FOR_STACK_OVERFLOW为2。仅仅使用这个方法是不可能的。