你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于RTOS任务栈溢出检测

[复制链接]
Jane 提问时间:2019-3-15 08:57 /
在FreeRTOS的资料上看到一种栈溢出检测方式,将任务栈的内容全部设为0xa5, 假设初始栈顶地址是&stack[1000], 那么我们可以检测栈底的一部分内容(假设是stack[16]-stack[0])是否被修改来判断栈是否溢出。资料提到一个弊端:有可能,栈末尾的16个字节没有用到,但是任务栈已经溢出了,这种检测不到。问题:压栈的时候都会按顺序压,压入一个字节sp减去1,怎么会有栈溢出了但是栈末尾的16个字节没有被修改的情况(排除压栈内容恰好是0xa5的情况)?

以下是原文:
任务创建的时候将任务栈所有数据初始化为
0xa5
,任务切换时进行任务栈检测的时候会检测末尾的
16
个字节是否都是
0xa5
,通过这种方式来检测任务栈是否溢出了。相比方法一,这种方法的速度稍慢些,但是这样就有效地避免了方法一里面的部分情况。不过依然不能保证所有的栈溢出都能检测到,比如任务栈末尾的
16
个字节没有用到,即没有被修改,但是任务栈已经溢出了,这种情况是检测不到的。另外任务栈溢出后,任务栈末尾的
16
个字节没有修改,但是溢出部分的栈区的数据修改了,这部分栈区的数据不重要或者暂时没有用到还不会有什么问题,但如果是重要数据被修改将直接导致系统进入硬件异常,这种情况下,栈溢出检测功能也是检测不到的。

收藏 评论4 发布时间:2019-3-15 08:57

举报

4个回答
edmundlee 回答时间:2019-3-22 22:46:25
压栈它不是一个Word一个Word的压的, 所谓任务调度, 其实就类似软件中断, 它可不是压一两个WORD啊。
调度器在压栈前就会检查栈空间, 不够的话, 它不会选择有多少就压多少的, 而是直接报错, 所以最后这一两个WORD没被改动。
但其实看到栈的顶部只剩几个WORD, 你就别多想了, 一定是栈空间不够了, 这次不出事, 下次问题都会找上门来的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

xiaojie0513 回答时间:2019-3-23 07:46:38

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

xiaojie0513 回答时间:2019-3-23 07:47:16
当 configCHECK_FOR_STACK_OVERFLOW 设置为 1 时选用方法 1。
任务被交换出去的时候,该任务的整个上下文被保存到它自己的栈空间中。这时任务栈的使用应当达到了一个峰值。当 configCHECK_FOR_STACK_OVERFLOW 设为1 时,内核会在任务上下文保存后检查栈指针是否还指向有效栈空间。一旦检测到栈指针的指向已经超出任务栈的有效范围,栈溢出钩子函数就会被调用。
方法 1 具有较快的执行速度,但栈溢出有可能发生在两次上下文保存之间(也就是任务正在运行的时候,很有肯溢出),这种情况不会被检测到,因为这种检测方式仅在任务切换中检测

Jane 回答时间:2019-4-9 15:39:08
xiaojie0513 发表于 2019-3-23 07:47
当 configCHECK_FOR_STACK_OVERFLOW 设置为 1 时选用方法 1。
任务被交换出去的时候,该任务的整个上下文被 ...

我的问题点在于:对于方法二,在何种场景下会发生“依然不能保证所有的栈溢出都能检测到,比如任务栈末尾的16个字节没有用到,即没有被修改,但是任务栈已经溢出了,这种情况是检测不到的”。
你的文章说的是这种情况几乎不可能出现,能否说一个场景,会出现这种末尾字节没有被改,但实际上栈溢出了??

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版