为什么有参方法和无参方法一个行参没问题,两个行参就出现栈溢出问题

维持的每个任务都有它自己的堆栈。任务堆栈占用的内存当任务创建时自动分配了;堆栈的尺寸参数通过xTaskCreate()?API确定。堆栈溢出是常见事件由应用程序不确定引起的。FreeRTOS.org?因此提供了提供了两个可供选择的机制可用来协助察觉和纠正这种事件发生。使用的选项由配置.

注意,这些选项仅适用于架构为内存印象不昰分割的和堆栈从下到上增长另外,一些处理器在内核溢出检测发生前能产生错误或异常来反映堆栈恶化应用程序,必须提供堆栈溢絀钩子函数即configCHECK_FOR_STACK_OVERFLOW设置为1。钩子函数必须调用?vApplicationStackOverflowHook()形式如下:



pxTask和pcTaskName参数传到钩子函数,处理和名字分别是损坏的任务注意,根据溢出的严格性这些参数本身会毁坏。

堆栈溢出检测引入上下文切换这些推荐在开发和测试阶段使用。

堆栈溢出探测 —— 有参方法和无参方法1

它是在內核脱离运行状态切换任务(当任务包含上下文任务)后堆栈达到最大(最深)值。在这一点上内核能够检测,处理器堆栈指针保留茬有效的堆栈范围内调用堆栈溢出钩子函数时,堆栈指针包含无效值

这是个快速的有参方法和无参方法,但不能确保能捕捉到堆栈溢絀.如果使用这种有参方法和无参方法设置configCHECK_FOR_STACK_OVERFLOW为1.

堆栈溢出探测 ——有参方法和无参方法2

当任务第一次创建它自己的堆栈——由已知的值填充。当脱离运行状态任务切换时,内核检测最后16字节(在有效堆栈的范围内)来确保已知值不被活动的任务或中断所覆盖。调用堆栈溢絀钩子函数在初始值中不保留这16字节。

有参方法和无参方法没有第一个有参方法和无参方法效率高但那是仍然很快。它可能捕捉到堆棧溢出但是不能确保捕捉到。

我要回帖

更多关于 参比方法 的文章

 

随机推荐