要有最朴素的生活,最遥远的梦想。及时明日天寒地冻,路远马亡。

Autosar事件机制——摘自百度文库

摘自https://wenku.baidu.com/view/19b75a8ff18583d04864591b.html,感谢原作者!

 

AUTOSAR事件机制

作者:邓孔宏  

1.1 事件

事件是由操作系统管理的对象。事件机制只提供给拓展的任务,它开始任务到waiting和去到waiting状态的转换,是一种同步的方法。

每个任务有一个确切数量的事件集。这个任务被称作那些事件的所有者。一个个别的事件被识别通过它的所有者和它的名称(或掩码)。事件可以被用来传达二进制信息到(事件分配到的)拓展的任务。

有多种可用的选项去操作事件,依据事件的所有者是专用的任务还是另一个(不一定要是一个拓展的任务的)任务。所有的任务可以设置任何不是suspended拓展的任务的任何事件。只有所有者能清除它的事件和去等待它的事件的接收。

任何的任务或者第二类中断可以设置一个事件给一个非suspended任务,这样通过这个事件通知这个拓展的任务关于任何状态的改变。

任何情况下一个事件的接收者是一个拓展的任务。因此,不可能一个中断服务程序或一个基础的任务等待一个事件。一个事件只能被该事件的所有者任务清除。

如果至少一个任务正等待的事件已经发生,该处于waiting状态的拓展的任务被释放到ready状态。如果一个拓展的任务试图等待一个事件,而这个事件已经发生,该任务继续在running状态。

1.2 事件控制

StatusType  SetEventTaskType  <TaskID>,EventMaskType  <Mask>

输入参数:TaskID 指的是要被设置一个或几个事件的任务

                 Mask 要被设置的事件的掩码

返回的Status:

标准的: ·  没有错误,E_OK

拓展的: ·  任务<TaskID>是无效的,E_OS_ID

              ·  涉及的任务不是拓展的任务,E_OS_ACCESS

              ·  事件被能被设置因为涉及的任务处于suspended状态,E_OS_STATE

一致性类别:ECC1,ECC2

该服务可能在一个中断服务程序和任务层被调用,但是不是在hook函数里被调用。

任务<TaskID>的事件被设置根据事件掩码<MASK>。如果任务<TaskID>在等待至少一个在<MASK>里规定的事件,调用SetEvent导致任务被转换到ready状态。

在事件掩码里没有被设置的事件维持不变。

 

 

StatusType  ClearEventEventMaskType  <Mask>

输出参数:MASK 要被清除的事件的掩码

返回的Status

标准的: ·  没有错误,E_OK

              ·  不是来自拓展任务的调用,E_OS_ACCESS

              ·  调用在中断层,E_OS_CALLEVEL

一致性类别:ECC1,ECC2

拓展任务的事件通过调用ClearEvent被清除根据事件掩码<Mask>

系统服务ClearEvent仅限于拥有该事件的拓展的任务。

 

StatusType  GetEventTaskType  <TaskID>EventMaskRefType  <Event>

输入参数:TaskID 所有的事件掩码要被返回的任务

输出参数:指向返回数据的内存

返回的状态值

标准的: ·  没有错误,E_OK

拓展的: ·  任务<TaskID>无效,E_OS_ID

              ·  涉及的任务<TaskID>不是一个拓展的任务,E_OS_ACCESS

              ·  涉及的任务<TaskID>处于suspended状态,E_OS_STATE

一致性类别:ECC1,ECC2

该服务返回任务<TaskID>当前的所有的事件二进制数字。

服务可能在中断服务程序,任务层和一些hook程序被调用。

任务<TaskID>的事件掩码的当前的状态被复制到<Event>

涉及的任务应该是一个拓展的任务。

 

 

StatusType  WaitEventEventMaskType  <Mask>

输入参数:Mask 等待的事件的掩码

返回的Status值:

标准的: ·  没有错误,E_OK

拓展的: ·  调用任务不是拓展的任务,E_OS_ACCESS

              ·  调用任务占据资源,E_OS_RESOURCE

              ·  调用在中断层,E_OS_CALLEVEL

一致性类别:ECC1,ECC2

调用任务被设置成waiting,除非规定在<Mask>里的至少一个事件已经发生。

如果等待的条件发生,这个调用强制重调度。如果重调度发生,任务的内部的资源被释放当任务处于waiting状态的时候。

该服务只能被拥有该事件的拓展的任务调用。

声明:本文主要内容从OSEK OS标准规范文件os223.pdf翻译而来,并结合AUTOSAR OS规范进行了部分调整。文件公开,用于研究和探讨,作者不承担引用本文而造成的任何后果。未经作者同意不允许用于任何商业用途。

 

posted @ 2018-09-20 23:06  Elf.Cheung  阅读(387)  评论(0编辑  收藏  举报