AUTOSAR事件机制
本文引自作者:邓孔宏 感谢作者辛勤付出
1.1 事件
事件是由操作系统管理的对象。事件机制只提供给拓展的任务,它开始任务到waiting和去到waiting状态的转换,是一种同步的方法。
每个任务有一个确切数量的事件集。这个任务被称作那些事件的所有者。一个个别的事件被识别通过它的所有者和它的名称(或掩码)。事件可以被用来传达二进制信息到(事件分配到的)拓展的任务。
有多种可用的选项去操作事件,依据事件的所有者是专用的任务还是另一个(不一定要是一个拓展的任务的)任务。所有的任务可以设置任何不是suspended拓展的任务的任何事件。只有所有者能清除它的事件和去等待它的事件的接收。
任何的任务或者第二类中断可以设置一个事件给一个非suspended任务,这样通过这个事件通知这个拓展的任务关于任何状态的改变。
任何情况下一个事件的接收者是一个拓展的任务。因此,不可能一个中断服务程序或一个基础的任务等待一个事件。一个事件只能被该事件的所有者任务清除。
如果至少一个任务正等待的事件已经发生,该处于waiting状态的拓展的任务被释放到ready状态。如果一个拓展的任务试图等待一个事件,而这个事件已经发生,该任务继续在running状态。
1.2 事件控制
StatusType SetEvent(TaskType
输入参数:TaskID 指的是要被设置一个或几个事件的任务
Mask 要被设置的事件的掩码
返回的Status值:
标准的: · 没有错误,E_OK
拓展的: · 任务
· 涉及的任务不是拓展的任务,E_OS_ACCESS
· 事件被能被设置因为涉及的任务处于suspended状态,E_OS_STATE
一致性类别:ECC1,ECC2
该服务可能在一个中断服务程序和任务层被调用,但是不是在hook函数里被调用。
任务
在事件掩码里没有被设置的事件维持不变。
StatusType ClearEvent(EventMaskType
输出参数:MASK 要被清除的事件的掩码
返回的Status值
标准的: · 没有错误,E_OK
· 不是来自拓展任务的调用,E_OS_ACCESS
· 调用在中断层,E_OS_CALLEVEL
一致性类别:ECC1,ECC2
拓展任务的事件通过调用ClearEvent被清除根据事件掩码
系统服务ClearEvent仅限于拥有该事件的拓展的任务。
StatusType GetEvent(TaskType
输入参数:TaskID 所有的事件掩码要被返回的任务
输出参数:指向返回数据的内存
返回的状态值
标准的: · 没有错误,E_OK
拓展的: · 任务
· 涉及的任务
· 涉及的任务
一致性类别:ECC1,ECC2
该服务返回任务
服务可能在中断服务程序,任务层和一些hook程序被调用。
任务
涉及的任务应该是一个拓展的任务。
StatusType WaitEvent(EventMaskType
输入参数:Mask 等待的事件的掩码
返回的Status值:
标准的: · 没有错误,E_OK
拓展的: · 调用任务不是拓展的任务,E_OS_ACCESS
· 调用任务占据资源,E_OS_RESOURCE
· 调用在中断层,E_OS_CALLEVEL
一致性类别:ECC1,ECC2
调用任务被设置成waiting,除非规定在
如果等待的条件发生,这个调用强制重调度。如果重调度发生,任务的内部的资源被释放当任务处于waiting状态的时候。
该服务只能被拥有该事件的拓展的任务调用。
声明:本文主要内容从OSEK OS标准规范文件os223.pdf翻译而来,并结合AUTOSAR OS规范进行了部分调整。文件公开,用于研究和探讨,作者不承担引用本文而造成的任何后果。未经作者同意不允许用于任何商业用途。