OSEK/VDX:静态定义的实时操作系统?
任务是完成特定功能的一段程序,为实现具有不同实时性要求的系统子功能提供了框架,任务可以异步方式“并行”运行,任务具有不同的优先级。
基本任务和扩展任务都有一个静态的优先级。高优先级任务运行时,低优先级任务会禁止,相同优先级别的任务也会被禁止。
1.可以被高优先级任务和高优先级中断抢占。
2.可以通过API服务设置不允许被抢占。
1.阻塞、就绪、运行 。
StartOS()时,基本任务通过对OIL文件的配置,来达到操作启动后基本任务的状态。如定义为自启动状态则 操作系统启动后该任务处于就绪状态,反之为阻塞状态。
与基本任务类似,多了一个附件状态--等待状态和2个附加事件--wait、trigger。
扩展任务进入等待状态后会等待一个事件,等待到事件后进入就绪状态。等待状态期间仍然暂用消耗资源,如堆 栈和内存空间。
基本任务 | 扩展任务 | |
激活事件 | 一个 | 多个 |
释放处理器方式 | 被抢断、终止、中断 | 被抢断、终止、中断 |
数据流控制 | 全局变量 | 局部变量 |
典型应用 | 周期轮训 | 事件驱动 |
决定了任务执行的顺序和访问处理器的优先权。优先级是创建任务时静态分配的,某些条件下,OS可动态改变任务优先级(针对资源管理的优先级天花板协议)。数值越大,优先级越高,一致性类定义了是否允许不同的任务具有相同的优先级,具有相同优先级的任务:根据FIFO原则顺序执行。
调度程序使用任务的优先级决定哪个单个任务的进入运行状态,每个任务使用静态优先级,运行过程中不能被改变,最低优先级是0.
Full Preemptive:
应用程序中所有任务都被OIL配置成抢占式任务,则该应用白用抢占式调度策略。
抢占式调度程序启用条件:
Non Preemptive:
与抢占式调度策略相反,当应用程序中所有任务都被OIL配置成非抢占式任务,则该应用白用非抢占式调度策略。
非抢占式调度程序启用条件:
混合强制式任务调度:
应用程序中部分任务被OIL配置成抢占式另一些为非抢占式任务,则采用混合调度策略。系统根据当前运行任务的抢占类型来决定是否启用调度程序。
优先级天花板协议:
OIL中定义资源,在应用程序中为任务集定义这个资源。
StatusType ActivateTask(TaskType<TaskID>)
使任务由挂起态转为就绪态, OS确保任务代码从第一条语句开始执行
@parameter TaskID ,为传入的要激活的任务名,该函数也可以在OIL中被调用
返回的错误值
StatusType TerminateTask(void)
终止被调用任务的运行, 任务由运行态进入挂起态
返回的错误值
StatusType Schedule(void)
引起任务的重新调度: 如果有更高优先级的任务处于就绪状态,并且任务的内部资源被释放, 那么当前任务转入就绪态, 其上下文会被保存, 更高优先级的任务被执行
返回的错误值
StatusType ChainTask (TaskType<TaskID>)
终止当前任务的运行, 并激活后继任务
返回的错误值
StatusType GetTaskID (TaskRefType<TaskID>)
获取当前正在运行的任务的ID信息
返回的错误值
StatusType GetTaskState(TaskType<TaskID>Z, TaskStateRefType<State>)
获取当前正在运行的任务的状态信息
返回的错误值
按照功能将中断处理程序分为两类
V2.1规范中规定了第3类ISR,V2.2规范中已将其删除
在第2类ISR中,允许使用除下列之外的所有系统服务函数
事件:
事件的主要目的是任务同步,事件被任务一对一的拥有,一个任务拥有一个事件时,这个事件即为扩展事件。设置了某事件后, 接收它的任务会切换到就绪状态,当任务表明在“等待某事件”时, 会切换到等待状态。一个任务可接收多个事件,一个事件只能分配给一个任务, 不存在广播事件。
中断 | 事件 | |
激活方式 | 由外部事件激活 | 由外部事件激活 |
处理方式 | 由等待的CPU/中断控制器处理 | 由等待的任务处理 |
优先级 | 取代低优先级的程序 | 取代低优先级的任务 |
任何为任务/ISR所占用的实体都可称为资源,如:
默认资源,操作系统调度器,被作为应用的资源。在任何一个希望在临界区不被另一个任务抢占的应用中,预先定义的资源,当调度器被加锁时,仍然可以接收并处理中断,中断任务作为非抢占式任务。
E_OK no error
E_OS_ID invalid resource ID
E_OS_ACCESS inadmissible access
E_OK no error
E_OS_ID invalid resource ID
E_OS_NOFUNC not occupied or wrong order
E_OS_ACCESS inadmissible access
警报主要用于处理循环发生的事件。