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运行的先后顺序没有做强制要求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文复现|智能算法改进】基于多策略麻雀搜索算法的机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及实现 2.改进点 改进的无限折叠迭代混沌映射 无限折叠迭代映射(ICMIC) 常用于图像加密方向的研究, 基本思想是首先生成[0,1]之间的混沌序列, …

【Qt秘籍】[008]-Qt中的connect函数

在Qt框架中,connect函数是一个非常核心的函数,用于实现信号(Signals)和槽(Slots)之间的连接,它是Qt信号槽机制的关键所在。信号槽机制是一种高级的通信方式,允许对象在状态改变时通知…

掘金AI 商战宝典-系统班:2024掘金AIGC课程(30节视频课)

课程目录 1-第一讲学会向Al提问:万能提问公式_1.mp4 2-第二讲用AI写视频脚本_1.mp4 3-第三讲用AI写视频口播文案_1.mp4 4-第四讲用AI自动做视频(上)_1.mp4 5-第五讲用AI自动做视频(中)_1.mp4 6-第六讲用AI自动做视…

1. Mybatis基础操作

目录 1.1 需求 1.2 准备 1.3 删除 1.3.1 功能实现 1.3.2 日志输入 1.3.3 预编译SQL 1.3.3.1 介绍 1.3.3.2 SQL注入 1.3.3.3 参数占位符 1.4 新增 1.4.1 基本新增 1.4.2 主键返回 1.5 更新 1.6 查询 1.6.1 根据ID查询 1.6.2 数据封装 1.6.3 条件查询 1.6.4 参…

Tree——输出项目的文件结构(Linux)

输出项目中的文件结构可以使用tree命令。tree是一个用于以树状结构显示目录内容的命令行工具。它非常适合快速查看项目的文件结构。安装: sudo apt-get install tree 使用: 在命令行中导航到项目的根目录,输出文件结构。 tree 也可以将结构输…

NXP RT1060学习总结 - CANFD功能

1、RT1060-CAN FD功能简介 这里使用RT1060系列的1064芯片进行开发,测试板是官方提供的开发板;RT1060系列支持3路CAN功能,CAN1和CAN2只能最为普通的CAN外设,支持CAN2.0,而CAN3支持CAN-FD功能;CAN-FD功能这里…

数据库概念

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式,可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本篇构建了这样的一个实例,可以动态修改UI的主题,通过菜单栏来选择预设的自定义主题和官方主题&#…

1+X Web应用软件测试(中级) 考试失利教训

考证考试结束的第二天复盘 复盘时间:2024/6/2 9:45-10:00 考试名称:1X Web应用软件测试(中级) 电子书:Web应用软件测试(中级) 他人备考技巧 改进: [考前策略]自动化40性能40功能2个20 1.可以2人分工合作,完成一整套功能测试题目 2.制定阶段时间的学…

使用PyCharm 开发工具创建工程

一. 简介 前面学习了 安装 python解释器。如何安装python的一种开发工具 PyCharm。 本文来简单学习一下,如何使用 PyCharm 开发工具创建一个简单的 python工程。 二. PyCharm 开发工具创建一个工程 1. 首先,首先打开PyCharm 开发工具。选择 创建一…

社交媒体数据恢复:淘宝旺信

根据搜索结果,阿里旺旺聊天记录的恢复方法如下: 运行阿里旺旺在旺旺面板底部点击小喇叭图标在打开的消息管理器窗口右上角点击"搜索"点击"高级搜索"设置所需查找的时间段---"搜索" 此外,在阿里旺旺的云存储中…

xdp、dpdk、rdma能在同一网卡上同时使用吗?

文心一言 XDP、DPDK和RDMA是三种不同的技术,它们各自在Linux网络性能优化中扮演了不同的角色。关于它们能否在同一网卡上同时使用,我们需要考虑以下几个方面: XDP(eXpress Data Path): XDP是Linux内核提供…

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

通过DLL方式链接glfw3.dll

主要是CMakeLists.txt文件变化 cmake_minimum_required(VERSION 3.10) project(glfwTest) set(CMAKE_CXX_STANDARD 11) aux_source_directory(. SRC_SOURCES) add_executable(glfwTest ${SRC_SOURCES}) target_link_libraries(glfwTest opengl32) # 链接库文件 target_inclu…

数据结构(C):从初识堆到堆排序的实现

&#x1f31e;0.前言 言C之言&#xff0c;聊C之识&#xff0c;以C会友&#xff0c;共向远方。各位博友的各位你们好啊&#xff0c;这里是持续分享数据结构知识的小赵同学&#xff0c;今天要分享的数据结构知识是堆&#xff0c;在这一章&#xff0c;小赵将会向大家展开聊聊堆的相…

年薪百万也难达财务自由?揭秘背后的真相!

谈及财务自由&#xff0c;人们往往会好奇&#xff1a;究竟需要多少资金才能跨越这道门槛&#xff1f;根据《胡润财富自由门槛》的调研&#xff0c;中国一线城市的财富自由标准从入门级的人民币1900万元到中级6500万到高级别的1.9亿元不等。然而&#xff0c;财务自由的核心并非仅…

ComfyUi安装OOTDiffusion插件的diffusers版本问题

OOTDiffusion换装 在github上有近5K的star了&#xff08;https://github.com/levihsu/OOTDiffusion&#xff09;。 diffusers版本问题 最新版是0.27.2&#xff0c;不能低于0.25&#xff0c;但是OOT换装需要0.24&#xff0c;否则会报错&#xff1a; ComfyUI\custom_nodes\Comf…

Android精通值Fragment的使用 —— 不含底层逻辑(五)

1. Fragment 使用Fragment的目标&#xff1a;根据列表动态显示内容&#xff0c;更简洁显示界面、查找界面 eg. 使用新闻列表动态显示新闻 1.1 Fragment的特性 具备生命周期 —— 可以动态地移除一些Fragment必须委托在Activity中使用可以在Activity中进行复用 1.2 Fragmen…

C#WPF数字大屏项目实战04--设备运行状态

1、引入Livecharts包 项目中&#xff0c;设备运行状态是用饼状图展示的&#xff0c;因此需要使用livechart控件&#xff0c;该控件提供丰富多彩的图形控件显示效果 窗体使用控件 2、设置饼状图的显示图例 通过<lvc:PieChart.Series>设置环状区域 3、设置饼状图资源样…