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中实现有效的错误管理,用户可以访问其他信息(如下图:处理的逻辑结构)。
![](https://i-blog.csdnimg.cn/blog_migrate/1de1895bbad839f620815d1a12fa2dac.png)
3 系统启动(StartupHook)
系统启动过程(单核系统,参考图1):
1)、重置后,用户可以自由地执行(不可移植的)硬件特定代码。第2类中断在第5阶段之前不允许运行。不可移植部分以检测应用模式结束。
2)、使用应用程序模式作为参数调用StartOS。
3)、操作系统执行内部启动功能
4)、调用钩子例程StartupHook,用户可以在其中放置初始化过程。在这个钩子例程中,所有用户中断都被禁用。
5)、操作系统允许用户中断并启动调度活动。
![](https://i-blog.csdnimg.cn/blog_migrate/8f599182556d5848471e1308c789d98a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d456dee4a20480418da5c1719e471edf.png)
4 系统关闭(ShutdownHook)
应用程序或操作系统可以由于致命错误而请求此服务(ShutdownOS)。当调用ShutdownOS时,操作系统将调用钩子例程ShutdownHook,然后关闭(如下图: 多核系统关闭过程)。用户通常可以在ShutdownHook中自由定义任何系统行为。
![](https://i-blog.csdnimg.cn/blog_migrate/22ab9c0f03c45909bbd4282ad63ef3b5.png)
5 系统保护(ProtectionHook)
发生严重的执行时间错误以及违背存储保护时会进入此钩子例程。
可采用的处理方式:
1)、关闭造成问题的任务/二类中断
2)、强制关闭任务/二类中断属于的应用集(或者重启(Restart))
3)、关闭系统
4)、不做处理
![](https://i-blog.csdnimg.cn/blog_migrate/4af2490780bf60f38258bca29e63954f.png)
6 调试
两个钩子例程(PreTaskHook和PostTaskHook)在任务上下文切换时被调用。这两个钩子例程可用于调试或时间测量(包括上下文切换时间)。每次在任务离开RUNNING状态之前,都会直接调用PostTaskHook;PreTaskHook每次在新任务进入RUNNING状态后直接调用。
![](https://i-blog.csdnimg.cn/blog_migrate/6f7ee753f6cbac1e42f4497f24dff310.png)