[AutoSar]BSW_OS 02 Autosar OS_STACK

发布时间:2026/9/2 23:29:44
[AutoSar]BSW_OS 02 Autosar OS_STACK 目录关键词平台说明一、 task stack1.1 Task stack 的共享1.2 task stack 的实际使用大小二、ISR stack2.1 ISR stack 的共享三、Single-stack单一栈和multi-stack 多栈策略3.1 Single-stack3.2 multi-stack四、Stack Check Strategy4.1Software Stack Check4.1.1 使用限制4.1.2配置4.1.3 检查的调用4.2 Stack supervision by memory protection unit (MPU)4.2.1 使用限制4.2.2 检查的调用五、Stack Usage Measurement5.1 配置5.2 API关键词嵌入式、C语言、autosar、OS、BSW平台说明项目ValueOSautosar OSautosar厂商vector ETAS芯片厂商TI编程语言CC编译器HighTec (GCC)回到总目录一、 task stack1.1 Task stack 的共享为了节约RAM 的使用TASK间可以共享使用stack但是要满足以下条件1.task 类型必须为basic task。2.task 的优先级必须相同。3.task必须配置为非抢占式的且勾选上OsTaskStackSharing4.task不能调用OS service Schedule()。5.共享stack 的task必须在同一个核内。1.2 task stack 的实际使用大小vector 工具链中一般每个task单独使用一个stack。在task 从run进入ready或者waiting的时候任务的等待事件栈上下文包括操作系统上下文本地数据函数调用的堆栈帧等被保存到内部操作系统缓冲区中他们的总大小就是task stack 的实际使用大小。二、ISR stack2.1 ISR stack 的共享为了节约RAM 的使用ISR间可以共享使用stack但是要满足以下条件1.ISR必须为2类中断2.ISR必须在同一个核内。3.OsIsrEnableNesting必须配置为FALSE。4.ISR必须为同一优先级。三、Single-stack单一栈和multi-stack 多栈策略此策略出现在ETAS 的实现方式中Vector没有此策略。3.1 Single-stack所谓的单一栈指的是所有的TASK都使用了同一个栈,当task被抢占的时候栈是被叠加的栈的实际大小会被一直增加。所以在配置stack大小的时候需要考虑到低优先级被抢占的情况避免栈的上溢OS会以最糟糕的抢占情况下去计算stack。下图为抢占式的task。而非抢占式的task的栈大小仅为当前task’的栈大小。如下图所示。3.2 multi-stack多栈模式指的是每一个task有单独的stack。即使使用多个物理堆栈RTA-OS仍然提供单堆栈体系结构的好处——当任务和/或isr共享一个优先级时每个物理堆栈上所需的堆栈空间可以被覆盖。但是要使堆栈分配正常工作您需要指定每个堆栈上所需的空间。如果您配置的目标需要此信息RTA-OS将要求您提供多个堆栈值。如下图所示四、Stack Check Strategy不管是何种OS都应该检测和保护stack避免其溢出。在MICROSAR OS中提供了如下策略Scalability ClassStack check strategySC1 / SC2Software stack checkSC3 / SC4Stack supervision by memory protection unit (MPU)什么是Scalability Class 见 [AutoSar]BSW_OS 01 Autosar OS入门第四节。4.1Software Stack Check初始化的时候在每一个stack 的最后填充0xAAAAAAAA以32位单片机为例当stack切换的时候检测最后这个elment是否被改变来判定stack的溢出。4.1.1 使用限制1.适用于SC1 SC2如果禁用了MPUSC3和SC4也能用Software Stack Check。2.无法检测到所有的 栈溢出因为有的时候相邻的stack已经被覆写了但是刚好上一个stack 的最后一个element没被改变。3.如果内存已经被破坏Software Stack Check 无法检测stack 溢出。4.1.2配置在SC1 SC2 scalability模式下 OsStackMonitoring true。4.1.3 检查的调用如4.1.2所述一旦激活了该检查机制OS会自动的检查每个stack一旦发现溢出则会转入shutdown如果用户配置了ShutdownHook在系统关闭前会调用此hook。4.2 Stack supervision by memory protection unit (MPU)在OS运行的整个过程中活动的stack都会交由MPU监控因此OS会保留一个专用的MPU区域用于在OS切换的时候进行覆写。由于MPU的机制stack不会越界访问所以stack溢出的情况不会发生但是内存冲突的情况是可能发生的一旦检测到内存冲突会立即调用ProtectionHook()用户可以在ProtectionHook()中决定如何进行下一步处理。4.2.1 使用限制仅仅适用于SC3 SC4.4.2.2 检查的调用OS会自动初始化一个MPU专有区域来监督stack。如何配置额外的MPU区域和区段链接将在 MPU章节详细讲解。五、Stack Usage Measurement我们可以在OS启动后的任一地方调用API来获取当前stack的占用大小。5.1 配置OsStackUsageMeasurement true5.2 API回到总目录