AUTOSAROsStack监控原理

原创 汽车电子嵌入式 2024-09-23 07:40

前言

《AUTOSAR OsTask切换原理》一文中,我们介绍基于TC3xx平台的OsTask的切换原理,TC3xxCSA + Stack组合实现Task的上下文的切换和恢复,知道TC3xx芯片的A[10]寄存器始终指向当前运行的TaskStack的栈顶,那么A[10]寄存器在运行过程中是否会越过TaskStack区域了?也就是发生StackOverflowOs又有什么机制可以监控的到了?本文就来介绍OsStack的监控原理。

目录


注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!

正文

1.AUTOSAR关于栈监控的描述

1.1. 背景

官方文档描述

在不提供任何内存保护硬件的处理器上,可能仍然需要为可检测的内存故障类别提供“尽最大努力利用可用资源”的方案。堆栈监控将识别任务或ISR在上下文切换时超过指定堆栈使用量的位置。这可能意味着在系统出错和检测到故障之间有相当长的时间。同样,在通知故障时,错误可能已被清除(当上下文切换发生时,堆栈可能小于指定的大小)。


仅仅监视系统的整个堆栈空间通常是不够的,因为不一定是正在执行的任务/ISR使用了比所需更多的堆栈空间——它可能是一个优先级较低的对象被抢占了。


通过让操作系统正确识别错误的Task/2ISR,可以节省大量调试时间。


请注意,对于使用MPU和可扩展性等级34的系统,堆栈溢出可能会在堆栈监控能够检测到故障之前导致内存异常。


1.2. 需求

操作系统模块应提供堆栈监控,以检测Task/2ISR的可能堆栈故障。


如果堆栈监控检测到堆栈故障,并且未配置ProtectionHook(),则操作系统模块应调用状态为E_OS_STACKFAULTShutdownOS()服务。


如果堆栈监控检测到堆栈故障,并且配置了ProtectionHook(),则操作系统模块应调用状态为E_OS_STACKFAULTProtectionHook.


2.MICROSAR的栈概念

MICROSAR定义了堆栈消费者(运行时上下文)可以使用的不同堆栈。然而,并非所有堆栈都可以被所有消费者使用。下表给出了MICROSAR的栈类型及其使用场景。


栈类型(Stack Type

多样性(Multiplicity

可能的堆栈消费者(Consumers

Init Stack

每个核1

OS initialization, Os_PanicHook(), Category 0/1

ISRs

Kernel stack

每个核1

> OS memory exception handling

> Os_PanicHook()

> Category 0 ISRs

Protection stack

每个核1个或者0

> ProtectionHook()

> OS API calls

> Os_PanicHook()

> Category 0 ISRs

Error stack

每个核1个或者0

> ErrorHooks (global and OS-application specific)

> OS API calls

> Category 0/1 ISRs

> Os_PanicHook()

Shutdown stack

每个核1个或者0

> ShutdownHooks (global and OS-application

specific)

> OS API calls

> Os_PanicHook()

> Category 0 ISRs

Startup stack

每个核1个或者0

> StartupHooks (global and OS-application specific)

> OS API calls

> Category 0/1 ISRs

> Os_PanicHook()

Non-Trusted Functions Stack

0…n

> Non-trusted functions

> OS API calls

> OS ISR wrapper

> Trusted functions

> Alarm callback functions

> Pre / PostTaskHook()

> Category 0/1 ISRs

> Os_PanicHook()

No nesting interrupt stack

每个核1个或者0

> No nesting category 2 ISRs

> OS API calls

> Trusted functions

> Alarm callback functions

> Category 0/1 ISRs

> Os_PanicHook()

Interrupt level stacks

0…n

> Nesting category 2 ISRs

> OS API calls

> OS ISR wrapper

> Trusted functions

> Alarm callback functions

> Category 0/1 ISRs

> Os_PanicHook()

Task stacks

0…n

> Tasks

> OS API calls

> OS ISR wrapper

> Trusted functions

> Alarm callback functions

> Pre / PostTaskHook()

> Category 0/1 ISRs

> Os_PanicHook()

IOC receiver pull callback stack

每个核1个或者0

> IOC receiver pull callback functions

> Category 0 ISRs

Table 2-1 MICROSAR Classic OS Stack Types


2.1. 任务栈共享

2.1.1. 概念描述

为了节省RAM,不同的基本任务可能共享相同的任务堆栈。满足以下要求的任务共享一个堆栈:


·具有相同配置优先级的基本任务。


·非抢占式的基本任务,配置为共享堆栈。在这些基本任务中,不允许调用OS服务Schedule().


·共享内部资源并配置为共享堆栈的基本任务。在这些基本任务中,不允许调用OS服务Schedule().


2.1.2. 任务栈共享激活

Basic TaskOsTaskStackSharing属性需要配置为True. 然后,操作系统根据抢占设置和分配的内部资源决定是否可以共享基本任务堆栈。


共享任务堆栈的大小是共享堆栈的所有任务堆栈大小的最大值。


注意1:无论OsTaskStackSharing的值如何,操作系统都会自动为具有相同配置优先级的基本任务激活堆栈共享。


注意2:通过将OsTaskStackSharing”设置为TRUE,可能无法在相应的基本任务中调用OS API服务Schedule()。如果在激活了堆栈共享的任务中调用Schedule(),操作系统会抛出错误。


注意3:任务的堆栈共享只能在分配给同一CPU核的任务之间实现


2.1.3. 任务栈使用

相互协作的任务共享同一堆栈。无需采取额外行动。


2.2. 中断栈共享

2.2.1. 概念描述


为了节省RAM,不同的2ISR可能共享相同的ISR堆栈。


·所有不可嵌套的2ISR可以共享一个堆栈。


·具有相同优先级的所有2ISR可以共享一个堆栈。


2.2.2. 中断栈共享激活

对于2ISR,属性“OsIsrEnableNesting”必须设置为FALSE


共享ISR堆栈的大小是所有配置的非稳定2ISR堆栈大小的最大值。


注意ISR的堆栈共享只能在分配给同一CPU核的ISR之间实现。


2.2.3. 中断栈使用

该功能由操作系统自动使用。同一核上所有不可嵌套的2ISR共享同一堆栈。


2.3. 软件栈检测

2.3.1 描述

操作系统将每个堆栈的最后一个元素初始化为特定的堆栈检查模式(check pattern)。每当执行堆栈切换(例如任务切换)时,操作系统都会检查有效堆栈的最后一个元素是否仍然保持堆栈检查模式(check pattern)。


如果操作系统检测到堆栈检查模式已被更改,则假定最后一个有效堆栈确实溢出。


MCU Types

Stack check pattern

32-Bit Microcontrollers

0xAAAAAAAA

Table 2-2 Stack Check Patterns


注意1:软件堆栈检查能够检测堆栈溢出。它无法避开它们!


注意2:软件堆栈检查无法检测到所有堆栈溢出。可能存在相邻堆栈的内存已被覆盖,但当前堆栈的最后一个元素仍保存堆栈检查模式的情况。在这种情况下,软件堆栈检查无法检测到溢出。


注意3:软件堆栈检查无法检测已销毁的内存量。


注意4:如果由于堆栈错误(E_OS_STACK_FAULT)而报告错误,API GetTaskID()可能不会返回导致栈错误的任务的ID.


2.3.2. 激活

SC1SC2配置中,必须将属性“OsStackMonitoring”设置为TRUE以激活软件堆栈检查功能。


注意:在Supervisor模式禁用MPU的平台上,SC3SC4配置的软件堆栈检查也可能被激活。在其他平台上,应在SC3SC4配置中关闭软件堆栈检查。


2.3.3. 使用

一旦该功能被激活,操作系统就会在每次堆栈切换时自动检查堆栈。


如果操作系统检测到堆栈溢出,它将关闭。如果配置了ShutdownHook,则会调用它来通知应用程序操作系统已关闭。


调试提示:在调用ShutdownHook()之前,操作系统会恢复堆栈检查模式。


2.4. MPU栈监控

2.4.1描述

在操作系统的整个运行期间,当前活动堆栈由微控制器的MPU监控。因此,操作系统保留了一个MPU区域,该区域由操作系统通过每个堆栈开关重新编程(切换改MPU区域到Next TaskStack区域)。


由于MPU避免了超出堆栈边界的写访问,因此不会发生堆栈溢出。


每当识别到内存违规(例如由于堆栈违规)时,都会引发异常。在异常处理中,操作系统调用ProtectionHook().


应用程序在ProtectionHook() 中决定如何处理内存保护违规。如果应用程序调用关闭操作系统,则还会调用ShutdownHook()(如果已配置)。


2.4.2激活

该系统必须配置为SC3SC4系统。


2.4.3使用

SC3/SC4系统中,操作系统自动初始化一个MPU区域以进行堆栈监控。


为了安全地检测堆栈违规,必须特别注意配置额外的MPU区域以及连接以下部分:

·配置其他MPU区域时,存储器区域不得授予对任何操作系统堆栈部分的写访问权限。这里还需要考虑区域的重叠。

·通过使用操作系统生成的链接器命令文件,可以确保操作系统堆栈连续链接到RAM中。

·需要一个与栈相邻的栈安全间隙(取决于栈的生长方向;见图2-1)。任何软件部件都不得对堆栈安全间隙具有写访问权限。

·堆栈安全间隙的大小必须至少达到MPU的粒度。这种限制通常是不够的,因为堆栈的访问偏移量可能大于MPU粒度。一种可能的解决方案是在RAM的开始或结束处链接堆栈部分(取决于增长方向)。

·安全间隙的连接是强制性的。否则,无法检测到地址最低的堆栈的堆栈违规。

Figure 2-1 Stack Safety Gap


注意1:不要配置授予任何操作系统堆栈写访问权限的MPU区域。


注意2:在联动方案(linkage scheme)中添加堆栈安全间隙。堆栈安全间隙是一个受限的内存区域。任何软件部件都不得具有对此区域的写访问权限。如果堆栈与存储区域相邻链接,则不需要安全间隙,因为写入访问受到硬件(如ROM)的限制。


2.5. 栈测量

2.5.1. 描述

在操作系统运行期间,应用程序可以获得最大的堆栈使用率。操作系统使用堆栈检查模式初始化所有操作系统堆栈(见表2-2)。


API函数能够返回每个堆栈的最大堆栈使用量(自调用StartOS() 以来)


2.5.2. 激活

设置” OsStackUsageMeasurement”参数位TRUE.


2.5.3. 使用

堆栈使用API可以在应用程序的任何地方使用。


3. MICROSARAUTOSAR OS栈保护的差异

3.1. 差异点1


AUTOSAR标准:如果堆栈监控检测到堆栈故障,且未配置ProtectionHook,则操作系统模块应调用状态为E_OS_STACKFAULTShutdownOS()服务。


MICROSAR实现:在具有MPU堆栈监控的SC3/SC4系统中:如果堆栈监控检测到堆栈故障且未配置ProtectionHook,操作系统模块应调用状态为E_OS_PROTECT_MEMORYShutdownOS()服务。


偏差原因:通过硬件堆栈监督,MICROSAR Classic OS无法区分堆栈违规和其他内存违规。


3.2. 差异点2

AUTOSAR标准:如果堆栈监控检测到堆栈故障并且配置了ProtectionHook,则操作系统模块应调用状态为E_OS_STACKFAULTProtectionHook().


MICROSAR实现:在具有MPU堆栈监控的SC3/SC4系统中:如果堆栈监控检测到堆栈故障并且配置了ProtectionHook,则操作系统模块应调用状态为E_OS_PROTECT_MEMORYProtectionHook().


偏差原因:通过硬件堆栈监督,MICROSAR Classic OS无法区分堆栈违规和其他内存违规。


4.栈保护实现

参考链接:https://blog.csdn.net/qq_36056498?spm=1011.2266.3001.5343


5.总结

本文介绍了AUTOSAR OS中关于栈监控的概念以及Stack监控的具体实现。在SC3SC4系统中因为使能了MPU保护,发生Stack Overflow后首先会由MPU识别到并产生Memory Protection Trap, 通过ProtectionHook()上报E_OS_PROTECT_MEMORYError. SC1SC2系统中因为没有使能MPU保护,则通过软件监控Stack实现,其监控原理也就是监控stack end address处的Stack Pattern有没有被篡改过,如果被篡改则上报E_OS_STACKFAULTError.



End

「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」


点击文章最后左下角的阅读原文可以获取更多信息


或者复制如下链接到浏览器获取更多信息

https://blog.csdn.net/qq_36056498/article/details/132125693


文末福利




1
.如需汽车电子嵌入式收集的学习文档,
后台回复“

资料

即可免费下载;

2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;



注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!


推荐阅读

汽车电子嵌入式精彩文章汇总第一期:20210530-20230703

汽车电子嵌入式精彩文章汇总第2期

汽车电子嵌入式精彩文章汇总第3期

【OS】AUTOSAR OS Event实现原理

【OS】AUTOSAR OS Spinlock实现原理(下篇)

【OS】AUTOSAR OS Spinlock实现原理(上篇)

CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗

TC3xx芯片CAN模块详解

AUTOSAR OS Alarm实现原理

AUTOSAR OsTask切换原理

TC3xx 芯片SPI模块详解

AUTSOAR ComStack如何实现PDU只收不发的



End


欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!

汽车电子嵌入式

微信扫描二维码,关注我的公众号


评论
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 94浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 48浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 89浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 79浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 166浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 171浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 85浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 181浏览
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 97浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 75浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 71浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 111浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦