• 402查看
  • 0回复

[Autosar] 盘点Autosar OS和其他OS的栈监测机制

[复制链接]


该用户从未签到

发表于 25-4-2024 19:50:16 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


在Autosar中我们通过配置OSStack选项来配置任务或者中断服务函数的栈的大小,当出现栈溢出时,OS就会通过回调告诉用户。我们使用的开源OS如μcos和freertos在调用其接口函数OSCreateTaskExt创建任务时指定了栈的大小,假如我们使能了栈监测功能,也会对任务栈进行监测。那么这些操作系统监测栈的原理是什么呢(文中默认栈为向下增长)?
1 μcos-II
μcos-II在创建任务时将栈内容全部初始化为0,之后使能OS_TASK_STAT_STK_CHK_EN选项后操作系统就会通过栈中连续0的个数来监测栈的使用情况,如下图所示。
盘点Autosar OS和其他OS的栈监测机制w1.jpg

2 freertos
Freertos根据configCHECK_FOR_STACK_OVERFLOW配置选项的不同,有两种不同的栈监测方法:1)configCHECK_FOR_STACK_OVERFLOW 为1时,检测栈底指针和栈起始指针,或者栈底指针和栈结束指针是否越界(直接判断大小即可,当栈增长方向为向下增长时,当栈底指针小于栈起始指针或者栈结束指针时认为栈溢出);2)configCHECK_FOR_STACK_OVERFLOW为2时,和μcos-II类似,只是freertos是在栈底填充一定数量(20个)的默认字节(如0xa5),来判断栈底指定数量的字节是否都为0xa5,如果被修改过,则认为栈溢出。两种监测方法如下图所示。
盘点Autosar OS和其他OS的栈监测机制w2.jpg

方法1监测示意图

盘点Autosar OS和其他OS的栈监测机制w3.jpg

方法2监测示意图

3 Autosar OS
Autosa OS官方文档没有具体描述栈监测的实现方法,因此各家的实现有所不同,本文列举VECTOR和ETAS的实现方法。
3.1 VECTOR OS栈监测
VECTOR OS的监测方法类似于μcos-II,只是其填充的是非零值(如0xAA)。
盘点Autosar OS和其他OS的栈监测机制w4.jpg

3.2 ETAS OS栈监测
ETAS OS的监测方法和freertos的方法1类似,即通过判断当前栈指针与栈底指针的大小来判断是否出现栈溢出。
4 总结
由上分析可以看出,总共有三种监测方法:1)填充后判断默认值的个数;2)判断栈指针和栈底指针的大小;3)栈底填充,判断填充值是否被破坏。方法3和方法1类似,只是方法3只能用来监测溢出而测量不了栈的实际使用情况。方法1和方法2相比,由于栈的监测只能在任务切换时进行,因此假如在之前调用过程出现栈溢出而在运行栈监测时栈溢出又恢复了,那么方法2是无法检测到这种情况的,但是方法1由于采用了默认值因此会有很低概率出现误报情况且需要使用while循环来判断栈实际使用情况,效率不如方法2。

快速发帖

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

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:58 , Processed in 0.240115 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.