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;最西点&…

关于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 服务…

使用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…

[数据集][目标检测]焊接处缺陷检测数据集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[]…

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

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

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

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

【scau大数据技术与原理2】综合性实验Spark集群的安装和使用——安装启动spark shell篇

实验内容简介&#xff1a; Spark是一个分布式计算框架&#xff0c;常用于大数据处理。本次实验中&#xff0c;首先设计一个包含主节点和从节点的Spark集群架构&#xff0c;并在CentOS的Linux环境下进行搭建。通过下载并解压Spark安装包&#xff0c;配置环境变量和集群参数&…

【Python Cookbook】S1E09 对切片命名

目录 问题解决方案讨论 问题 代码的可阅读性非常重要&#xff0c;如何增强切片中的可阅读性&#xff1f;本文将提供一种方案。 解决方案 假设有一些代码用来从字符串的固定位置取出具体的数据&#xff1a; record "...100...513.25..." cost int(record[3:6]) …

【显示方案IC-速显微】

最近偶然间接触到“速显微”的显示方案&#xff0c;个人体验了一把感觉还是挺顺手的&#xff0c;虽然手里没有板子没有上手测试一番。 这是他们的官网链接&#xff1a; https://www.thorsianway.com/product/chip 从官网可以看到有两颗个系列的IC已经量产&#xff1a;GC9005和G…

Docker部署pulsar独立集群消息队列服务器

1、下载Pulsar docker 镜像 docker pull apachepulsar/pulsar:latest 2、生成Pulsar容器&#xff0c;把容器的6650和8080端口映射到宿主机的6650和8080端口&#xff0c;standalone参数表示pulsar为独立集群模式&#xff0c;把容器中的conf目录映射到宿主机的/var/lib/docker/…

【QEMU中文文档】1.1 支持的构建平台

本文由 AI 翻译&#xff08;ChatGPT-4&#xff09;完成&#xff0c;并由作者进行人工校对。如有任何问题或建议&#xff0c;欢迎联系我。联系方式&#xff1a;jelin-shoutlook.com。 原文&#xff1a;Supported build platforms — QEMU documentation QEMU 旨在支持在多个主机…

基础—SQL—DCL(数据控制语言)小结

一、总结 在SQL分类中的DCL语句部分&#xff0c;主要讲到了两个部分的知识。 1、用户管理 用户管理&#xff0c;主要是管理哪些用户可以访问当前 mysql 数据库。 包括&#xff1a;创建用户、修改用户密码以及删除用户 2、权限控制 权限管理&#xff0c;主要是控制我们当前用户…

vue前端Echars

<template><div :class"className" :style"{height:height,width:width}" /> </template><script> import * as echarts from echarts require(echarts/theme/macarons) // echarts theme 柱状图 import resize from ./mixins/re…