• Autosar模块介绍:AutosarOS(5)


    上一篇 | 返回主目录 | 下一篇

    1 钩子例程

    钩子例程特点
    1)、由操作系统调用,在特定的上下文中取决于操作系统的实现
    2)、高于所有任务
    3)、不被第二类中断程序打断。
    4)、操作系统的一部分
    5)、由用户使用用户定义的功能实现
    6)、在接口上是标准化的,但在功能上不是标准化的(钩子例程本身的环境和行为),因此钩子例程通常是不可移植的
    7)、只允许使用API函数的子集

    钩子例程作用
    1)、系统启动:在操作系统启动之后和调度程序运行之前调用相应的钩子例程(StartupHook)
    2)、系统关闭:当应用程序或操作系统在出现严重错误时请求系统关闭时调用 (ShutdownHook)
    3)、跟踪或依赖于应用程序的调试目的,以及用户定义的上下文切换扩展(PreTaskHook、Post Task Hook)
    4)、错误处理(ErrorHook)

    #OSEK的每个实现都必须遵循钩子例程的约定:
    1)、如果应用程序在钩子例程中调用了一个不允许的API服务,则行为没有定义
    2)、如果引发错误,则实现应该返回特定于实现的错误代码

    2 错误处理(ErrorHook)

    提供错误服务来处理OSEK操作系统中临时和永久发生的错误。它的基本框架是预先定义的,由用户自行完成。这使用户可以选择有效的集中或分散的错误处理。区分了两种不同的错误:
    应用程序错误:操作系统无法正确执行请求的服务,但假定其内部数据是正确的。在这种情况下,将调用集中错误处理。此外,操作系统通过状态信息返回错误码对其进行分散的错误处理。由用户根据发生的错误类型来决定处理方式。
    致命错误:操作系统不能再保证其内部数据的正确性。在这种情况下,操作系统调用集中式系统关闭。

    #所有这些错误服务都有一个指定错误标识符(宏编号)

    OSEK操作系统提供两个级别的错误检查,标准状态和扩展状态。如果一个任务在标准状态的版本中被激活,会返回“E_OK”或“Too many task activation”。在扩展状态的版本中,可以返回额外的返回值“Task is invalid”、“Task still occupy resources”等。这些扩展的返回值在执行时不再出现在目标应用程序中,也就是说,相应的错误不会在操作系统的运行时版本中被拦截。

    OSEK api服务的返回值优先于输出参数。如果一个API服务返回错误,输出参数的值是未定义的。

    错误钩子例程
    如果系统服务返回的StatusType值不等于E_OK,则会调用错误钩子例程(ErrorHook)。如果从ErrorHook本身调用系统服务,则钩子例程ErrorHook不会被调用(也就是说,error钩子的递归调用不会发生)。从ErrorHook调用系统服务时可能发生的任何错误都只能通过计算返回值来检测。
    如果在任务激活或事件设置期间检测到错误,例如在警报过期或消息到达时,也会调用ErrorHook。

    错误管理
    为了在ErrorHook中实现有效的错误管理,用户可以访问其他信息(如下图:处理的逻辑结构)。

    3 系统启动(StartupHook)

    系统启动过程(单核系统,参考图1)
    1)、重置后,用户可以自由地执行(不可移植的)硬件特定代码。第2类中断在第5阶段之前不允许运行。不可移植部分以检测应用模式结束。
    2)、使用应用程序模式作为参数调用StartOS。
    3)、操作系统执行内部启动功能
    4)、调用钩子例程StartupHook,用户可以在其中放置初始化过程。在这个钩子例程中,所有用户中断都被禁用。
    5)、操作系统允许用户中断并启动调度活动。

    4 系统关闭(ShutdownHook)

    应用程序或操作系统可以由于致命错误而请求此服务(ShutdownOS)。当调用ShutdownOS时,操作系统将调用钩子例程ShutdownHook,然后关闭(如下图: 多核系统关闭过程)。用户通常可以在ShutdownHook中自由定义任何系统行为。

    5 系统保护(ProtectionHook)

    发生严重的执行时间错误以及违背存储保护时会进入此钩子例程。

    可采用的处理方式:
    1)、关闭造成问题的任务/二类中断
    2)、强制关闭任务/二类中断属于的应用集(或者重启(Restart))
    3)、关闭系统
    4)、不做处理

    6 调试

    两个钩子例程(PreTaskHook和PostTaskHook)在任务上下文切换时被调用。这两个钩子例程可用于调试或时间测量(包括上下文切换时间)。每次在任务离开RUNNING状态之前,都会直接调用PostTaskHook;PreTaskHook每次在新任务进入RUNNING状态后直接调用。

    上一篇 | 返回主目录 | 下一篇

  • 相关阅读:
    【JS】js给对象动态添加、设置、删除属性名和属性值
    【C++】泛型编程
    达梦数据库相关SQL及适配Mysql配置总结
    Google Earth Engine(GEE)——将字符串的转化为数字并且应用于时间搜索( ee.Date.fromYMD)
    Python subprocess模块学习笔记
    Mybatis动态sql语句的使用
    LeetCode·每日一题·1704.判断字符串的两半是否相似·双指针
    08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
    安卓毕业设计app项目基于Uniapp+SSM实现的家庭账单财务APP
    MIT 6.S081学习笔记(第三章)
  • 原文地址:https://blog.csdn.net/u012406840/article/details/127849850