标签:因此 清除 状态 调度 一个个 task running 返回 无效
摘自https://wenku.baidu.com/view/19b75a8ff18583d04864591b.html,感谢原作者!
AUTOSAR事件机制
作者:邓孔宏
1.1 事件
事件是由操作系统管理的对象。事件机制只提供给拓展的任务,它开始任务到waiting和去到waiting状态的转换,是一种同步的方法。
每个任务有一个确切数量的事件集。这个任务被称作那些事件的所有者。一个个别的事件被识别通过它的所有者和它的名称(或掩码)。事件可以被用来传达二进制信息到(事件分配到的)拓展的任务。
有多种可用的选项去操作事件,依据事件的所有者是专用的任务还是另一个(不一定要是一个拓展的任务的)任务。所有的任务可以设置任何不是suspended拓展的任务的任何事件。只有所有者能清除它的事件和去等待它的事件的接收。
任何的任务或者第二类中断可以设置一个事件给一个非suspended任务,这样通过这个事件通知这个拓展的任务关于任何状态的改变。
任何情况下一个事件的接收者是一个拓展的任务。因此,不可能一个中断服务程序或一个基础的任务等待一个事件。一个事件只能被该事件的所有者任务清除。
如果至少一个任务正等待的事件已经发生,该处于waiting状态的拓展的任务被释放到ready状态。如果一个拓展的任务试图等待一个事件,而这个事件已经发生,该任务继续在running状态。
1.2 事件控制
StatusType SetEvent(TaskType <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 ClearEvent(EventMaskType <Mask>)
输出参数:MASK 要被清除的事件的掩码
返回的Status值
标准的: · 没有错误,E_OK
· 不是来自拓展任务的调用,E_OS_ACCESS
· 调用在中断层,E_OS_CALLEVEL
一致性类别:ECC1,ECC2
拓展任务的事件通过调用ClearEvent被清除根据事件掩码<Mask>。
系统服务ClearEvent仅限于拥有该事件的拓展的任务。
StatusType GetEvent(TaskType <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 WaitEvent(EventMaskType <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规范进行了部分调整。文件公开,用于研究和探讨,作者不承担引用本文而造成的任何后果。未经作者同意不允许用于任何商业用途。
标签:因此 清除 状态 调度 一个个 task running 返回 无效
原文地址:https://www.cnblogs.com/Elf-Cheung/p/9683921.html