OSEK错误处理及跟踪调试

1 前言

        如表1所示,OSEK提供了一些特殊的钩子例程(Hook routines),应用层可以在钩子函数中自定义操作,以参与到操作系统的内部处理中。

表1 钩子函数类型
钩子函数例程功能用途
ErrorHook用于错误处理
StartupHook在系统启动后,调度器运行前调用(is called after the operating system startup and before the scheduler is running.)
ShutdownHook当应用层请求系统关闭,或OS自身因为严重的错误要关闭系统时,调用该钩子函数
PreTaskHook上下文切换过程中,新任务进入运行态那一刻调用
PostTaskHook上下文切换过程中,老任务退出运行态那一刻调用

        这些钩子函数例程有如下特点:

        • 钩子函数由OS调用,其调用的上下文取决于OS的具体实现,即完全由OS决定;
        • 优先级比所有任务都高;
        • 不会被二类中断(category 2 interrupt routines)打断;
        • 是操作系统的一部分,但由应用层来定义实现其具体操作内容;
        • 在接口层统一标准,但功能层(environment and behaviour of the hook routine itself)取决于具体实现,因此通常不具有移植性;        

图1 API调用限制说明 

       由图1可见,大多的系统API服务都不可在钩子例程中使用,这一限制主要是为了降低系统的复杂度。如果应用函数在钩子例程中违规调用了不可用的API服务,其行为是未定义的,但OS应返回特定的错误码。 


2 错误处理(Error handling)

        OSEK提供了一种错误处理服务(error service),用于处理OS的临时错误或持续性错误(temporarily and permanently occurring errors)。也就是说,ErrorHook是用来处理OS内部检测到的错误,这些错误的直接体现就是各系统服务API的返回值。

2.1 错误分类

        OSEK将错误分为两类,应用错误(Application errors)和致命错误(Fatal errors),其对应的处理策略也各不相同。在错误处理的过程中,这些错误处理服务都会获得对应的错误参数,以明确错误信息。       

        对于应用错误来说,其主要表现是OS对应的系统服务的执行出现了错误,但OS的内部数据结构仍保持正确性和完整性。在这种情况下,OS会先进行集中式的错误处理(centralised error treatment),并向通过处理状态返回错误信息,由应用层根据错误类型决定后续操作,即所谓的分散化处理(decentralised error treatment)。

        对于致命错误来说,OS无法在保证其内部数据结构的正确性和完整性,诸如任务控制块、任务控制列表等。在这种情况下,OSEK会选择人死帐销,直接调用集中式系统关闭。

        OSEK将错误检查分类两类,标准状态和拓展状态(standard status and extended
status)。如果一个任务是是在标准状态下激活的,则可以返回"E_OK" 或 “Too many task
activations”两种状态;而拓展状态在此基础上,还可以返回"Task is invalid" 或 "Task still occupies resources"等状态。

        此外,对于OSEK来说,系统调用API的返回值的优先级高于其输出参数。也就是说,当返回值为错误时,其对应的输出参数是未定义的。

2.2 避免ErrorHook的递归调用

        当一个系统调用的返回值不为E_OK时,就会调用错误处理钩子例程(ErrorHook)。特殊地,为了防止ErrorHook的递归调用,OSEK规定,如果发生错误的该系统调用来自于ErrorHook内部,则错误发生时,不会触发对ErrorHook的(递归)调用。

        因此,在ErrorHook内部,如果进行系统API的调用,其错误检查的唯一方式就是判断该系统调用的返回值。

2.3 错误处理

        OSEK为ErrorHook的错误处理制定了标准规范,以方便获取错误时的上下文信息,包括发生错误时的系统调用API及其对应调用参数,具体逻辑架构如图2所示:

图2  Example of centralised error handling (extended status)

         其中,宏OSErrorGetServiceId()提供发生错误时所调用的系统服务ID(service identifier),其对应的类型为OSServiceIdType,取值通常为OSServiceId_xxxx(xxxx为系统服务的名字)。

        关于系统服务的参数获取,也有标准的命名规范,通常统一为OSError_Name1_Name2:

• Name1: is the name of the system service
• Name2: is the official name of the parameter within the OSEK OS specification

         举例来说,当触发ErrorHook的系统服务为SetRelAlarm时,SetRelAlarm对应的参数通常可以通过以下宏定义获取:

• OSError_SetRelAlarm_AlarmID()
• OSError_SetRelAlarm_increment()
• OSError_SetRelAlarm_cycle()

 2.4 系统启动(System start-up)

        通常来说,处理器复位后,系统初始化的过程取决于具体的实现,但OSEK规定了一个标准的初始化流程,包括硬件初始化、OS初始化及应用的初始化。

        OSEK并未强制应用程序在系统初始化完成后定义特定的任务,但允许指定一些自启动任务自启动定时器(autostart alarms)随着系统初始化一起启动。

图3 System start-up

          系统的启动过程如图3所示:

        ① CPU复位后,首先进行的时硬件的初始化,初始化完成后会进行应用模式的判别(application mode),处于安全考虑,该判别不可依赖于系统历史记录(system history);

        ② 随后就是可移植的部分了,标准接口StartOS会根据当前的应用模式进行OS的初始化;

        ③ OS进行一系列的初始化操作;

        ④ 调用StartupHook,该钩子函数的实现由应用层实现,主要用于进行一些和OS强相关的一些初始化操作,应用层可以通过GetActiveApplicationMode获取当前的应用模式,在此过程中,所有中断都被禁用;

        ⑤ 钩子函数运行完毕后,OS会使能所有中断,启动调度器,并先后激活当前应用模式下定义的自启动任务和自启动定时器,最后,系统开始运行,开始按调度规则启动应用层定义的任务。

2.5 系统关闭(System shutdown)

         OSEK定义了一个标准接口ShutdownOS用于系统的关闭。该接口通常由应用层调用,请求关闭系统,或者由于OS探测到致命错误时,主动调用。

        当ShutdownOS被调用时,OS会调用钩子例程ShutdownHook函数,并待其执行完毕后,才真正关闭系统。

2.6 系统调试(Debugging)

        PreTaskHook PostTaskHook用于在任务切换的上下文中调用,具体如图4所示。这两个钩子例程函数主要用于系统调试或时间测量(time measurement),包括上下文切换时间。        

        因此,PostTaskHook会在老任务离开运行态之间被调用,而PreTaskHook 则是在新任务进入运行态那一刻被调用。由于调用时新老任务都仍旧/已经(still/already)在运行态,整个过程中,系统服务GetTaskId都是可用的。

图4 PreTaskHook and PostTaskHook

         若是被ShutdownOS调用时,有任务正在运行,则ShutdownOS可以调用PostTaskHook,也可以不调用PostTaskHook,且OSEK对PostTaskHook和ShutdownHook运行的先后顺序没有做强制要求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.Net Core 实现分片下载的最简单方式

技术群里的朋友遇到了这个问题,起初的原因是他对文件增加了一个属性配置 fileResult.EnableRangeProcessing true;这个属性我从未遇到过,然后,去F1查看这个属性的描述信息也依然少的可怜,只有简单的描述为(获取或设置为 启用范围…

Golang | Leetcode Golang题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; func isPalindrome(s string) bool {s strings.ToLower(s)left, right : 0, len(s) - 1for left < right {for left < right && !isalnum(s[left]) {left}for left < right && !isalnum(s[right]) {right--}if l…

GIS Java 生成四至图

目录 前言 操作步骤&#xff1a; 1&#xff0c;求出多边形的四至点 2&#xff0c;下载地图 3&#xff0c;绘制多边形 前言 对于地图上的一个多边形地块&#xff0c;其四至图就是能够覆盖这个多边形的最小矩形&#xff0c;也就是求出这个多边形的最东点&#xff0c;最西点&…

Java方法存档。组件容器

setIcon(new ImageIcon("banana.jpg")); javax.swing.ImageIcon.ImageIcon&#xff08;字符串文件名&#xff09; ConstructorProperties&#xff08;value{“描述”}&#xff09; 从指定的文件创建 ImageIcon。将使用 MediaTracker 预加载图像以监控图像的加载状…

关于GPT-4o的使用感受和评价

如何评价GPT-4o? 简介&#xff1a; 最近&#xff0c;GPT-4o横空出世。GPT-4o的发布无疑是人工智能领域的一次重大飞跃&#xff0c;它不仅仅是一个技术产品的迭代&#xff0c;更是人机交互理念的一次革新。作为OpenAI倾力打造的最新旗舰模型&#xff0c;GPT-4o在前代产品的基础…

Vue.js2+Cesium1.103.0 十六、多模型轨迹运动

Vue.js2Cesium1.103.0 十六、多模型轨迹运动 Demo <template><div id"cesium-container" style"width: 100%; height: 100%;"><ul class"ul"><li v-for"(item, index) of deviceInfo" :key"index" cl…

制作ChatPDF之前端Vue搭建(二)

前端界面 接上篇: 制作ChatPDF之Elasticsearch8.13.4搭建&#xff08;一&#xff09; 为了实现一个基于 Vue.js 的前端应用&#xff0c;用户可以上传 PDF 文件&#xff0c;输入查询&#xff0c;并在输出框中显示查询结果&#xff0c;你需要以下步骤&#xff1a; 初始化 Vue …

AIGC商业案例实操课,发觉其创造和商业的无限可能,Ai技术在行业应用新的商机

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89307523 更多资源下载&#xff1a;关注我。 课程内容 1 AI为什么火 。写在课程前面的寄语 。AIGC标志性事件:太空歌剧院 。AI人工智能为什么这么火 &#xff0c;AI人工智能发展历程 。聊天AI会取…

【U-Boot 源码深度解析】001 - Ubuntu 24.04 虚拟机 及 基础环境搭建

【U-Boot 源码深度解析】001 - Ubuntu 24.04 虚拟机 及 基础环境搭建 一、VMware 、Ubuntu 安装包下载二、解决VMware NET 模式&#xff0c;虚拟机无法上网问题三、配置 Ubuntu 24.04 开发环境3.1 配置清华源 sources3.2 配置 Telnetd 服务3.3 配置 SSH 服务2.4 配置 samba 服务…

React框架的快速入门

React框架的快速入门可以按照以下步骤进行&#xff0c;同时结合参考文章中的相关数字和信息&#xff0c;我将为你提供一个清晰的入门指南&#xff1a; 一、了解React React是一个流行的JavaScript库&#xff0c;专注于构建用户界面。它的主要特点包括&#xff1a; 组件化架构…

什么是gRPC?

gRPC&#xff08;gRPC Remote Procedure Call&#xff09;是一个高性能、开源、通用的远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;最初由 Google 开发。gRPC 使用 HTTP/2 作为传输协议&#xff0c;并采用 Protocol Buffers&#xff08;protobuf&#xff09;作为接…

使用autodl服务器进行模型训练

1.注册并且选择一个服务器租用 2.点击jupyter lab进入服务器内部 3.把yolov5-master这个的压缩文件上传到jupyter的文件列表中 4.打开终端 (1)查看目录 ls (2)解压yolov5-master(1) unzip "yolov5-master (1).zip" 可以看到解压成功&#xff01; (3)进入yolov5-m…

【Ubuntu上安装mvn】

Installing Maven on Linux/Ubuntu 在 Linux 系统中安装 Maven。 Step 1: Download the Maven Binaries 下载解压 $ wget <https://mirrors.estointernet.in/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz> $ tar -xvf apache-maven-3.6.3-bin…

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的系统隔离属性

安全之安全(security)博客目录导读 目录 一、系统隔离属性 1、系统配置完整性 1.1、时间隔离 2、关键错误的报告 一、系统隔离属性 1、系统配置完整性 MSD必须确保任何可能危及其安全保证的系统寄存器的正确性和完整性。例如&#xff0c;MSD必须确认内存控制器配置是一致…

[数据集][目标检测]焊接处缺陷检测数据集VOC+YOLO格式3400张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3400 标注数量(xml文件个数)&#xff1a;3400 标注数量(txt文件个数)&#xff1a;3400 标注…

基于Chan-Vese算法的图像边缘提取matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................................................ % 迭代更新水平集函数 err[]…

PLC编程与IT编程的区别:深入探索两者之间的奥秘

PLC编程与IT编程的区别&#xff1a;深入探索两者之间的奥秘 在科技日新月异的今天&#xff0c;编程已成为各个领域中不可或缺的技能。然而&#xff0c;在众多的编程领域中&#xff0c;PLC编程和IT编程因其各自独特的特点和应用领域而备受关注。那么&#xff0c;PLC编程和IT编程…

【Linux】GNU编译器基础

文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等&#xff0c;适用于C/C中&#xff0c;在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作&#xff0c;但在Linux系统中通常使用GNU编译器来进行&#xff0c;对于C/C等高级语言需要进行预编译、编…

亚马逊对IP的要求是什么?

IP的全称为Internet Protocol&#xff0c;是TCP/IP体系中的网际层协议&#xff0c;IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。IP规定网络上所有的设备都必须有一个独一无二的IP地址&#xff0c;就好比是邮件上都必须注明收件人地址&#xff0c;邮递员才能…

函数递归输出1~100的数字及递归的栈溢出问题

什么是递归&#xff1f; 递归就是函数⾃⼰调⽤⾃⼰递归中的递就是递推的意思&#xff0c;归就是回归的意思如果递归就像循环一样&#xff0c;打一个大的复杂问题转化一个小的问题&#xff0c;但是要与原问题相似&#xff0c;分解成规模较⼩的⼦问题来求解&#xff1b;直到⼦问…