OSEK:TASK 管理

1、Task 概念

复杂的控制软件可以方便地细分为按实时性要求执行的部分。这些部分可以通过Task的方式来实现。Task为函数的执行提供框架。

操作系统提供Task的并发和异步执行,调度器组织任务执行的顺序。

OSEK操作系统提供了一种Task切换机制,包括一种在没有其他系统或应用程序功能处于活动状态时处于活动状态的机制。这种机制称为idle-mechanism。

OSEK操作系统提供了以下两种不同的任务概念:

        1. Basic tasks

        basic tasks只在以下情况释放处理器:

        (1)任务终止

        (2)OSEK操作系统切换到更高优先级的任务

        (3)导致处理器切换到中断服务程序(ISR)的中断发生。

        2. Extended tasks

        扩展任务与基本任务的区别在于允许使用操作系统调用WaitEvent,它可能会导致waiting状态。waiting状态允许释放处理器,并将其重新分配给低优先级的任务,而不需要终止正在运行的扩展任务。从操作系统的角度来看,扩展任务的管理在原则上比基本任务的管理更复杂,需要更多的系统资源。

2、Task state model

一个任务必须在多个状态之间切换,因为处理器在任何时候只能执行一个任务的一条指令,而多个任务可能在同一时间竞争处理器

OSEK操作系统负责在必要时与任务状态转换一起保存和恢复任务上下文。

下面描述两种任务类型的任务状态以及状态之间的转换。

        1. Basic tasks状态转换

running在运行状态下,CPU被分配给任务,使其指令可以执行。在任何时间点,只有一个任务处于这种状态,而其他所有的状态都可以被多个任务同时采用。

ready转换到运行状态的所有功能性先决条件都存在,任务只等待处理器的分配。调度程序决定接下来执行哪个准备好的任务。

suspended在挂起状态下,任务是被动的,可以被激活。

注:在多个激活请求的情况下,任务激活不会立即改变任务的状态。如果任务没有挂起,激活只会被记录下来并在以后执行。

        2. Extended tasks状态转换

running在运行状态下,CPU被分配给任务,使其指令可以执行。在任何时间点,只有一个任务处于这种状态,而其他所有的状态都可以被多个任务同时采用。

ready转换到运行状态的所有功能性先决条件都存在,任务只等待处理器的分配。调度程序决定接下来执行哪个准备好的任务。

waiting任务不能继续执行,因为它必须等待至少一个事件。

suspended在挂起状态下,任务是被动的,可以被激活。

注:只有当任务终止自己("self- terminate ")时,才有可能终止任务。这一限制降低了操作系统的复杂性。没有提供从suspended状态到waiting状态的直接转换。这种转换是多余的,会增加调度器的复杂性。

        3. Task类型比较

Basic task没有waiting状态,因此只包含任务开始和结束的同步点。具有内部同步点的应用部分应由一个以上的基本任务来实现。

Basic task的优点是基于运行时间对RAM有一个适度的需求。

Extended task的优点是无论哪个同步请求处于active状态,它们都可以在单个任务中处理一致的任务。一旦缺少当前的信息进行进一步处理,extended就会切换到waiting状态。

每当相应的事件发出接收或更新所需数据或事件的信号时,它就会退出此状态。扩展任务也包含比基本任务更多的同步点。

3、激活&终止Task

        1.激活Task

        任务激活是通过操作系统服务ActivateTask或ChainTask执行的。激活之后,任务就可以从第一条语句开始执行了。OSEK操作系统在启动任务时不支持C-like参数传递。这些参数应该通过消息通信或全局变量传递。

         基于一致性阶层的不同,一个basic task可以被激活一次或多次。“任务激活的多个请求”是指OSEK操作系统接收并记录一个已经激活的basic task的并行激活。

并行多个请求的数量在系统生成期间在一个basic task特定属性中定义。如果未达到多个请求的最大数量,则请求将进入队列。basic task激活的请求按照激活顺序按优先级排队。

        2.终止Task

        在OSEK操作系统中,任务只能终止自己(“self- terminate”)。

        OSEK操作系统提供了服务ChainTask,以确保在正在运行的任务终止后立即执行专用的任务激活。链接本身会将新激活的任务放到优先队列的最后一个元素中。

每个任务都应该在其代码的末尾终止自己。在没有调用Terminatetask或ChainTask的情况下结束任务是被严格禁止的,并且会导致未定义的行为。

4、Task优先级

决定启动哪个任务和触发所有必要的OSEK操作系统内部活动的实体称为调度器(scheduler)

调度器根据任务优先级(优先级)来决定哪个任务是下一个要转移到running状态的ready tasks。0被定义为任务的最低优先级。因此,更大的数字定义更高的优先级。

为提高效率,不支持动态优先级管理。因此,任务的优先级是静态定义的,即用户在执行时不能更改它。但是,在特定的情况下,操作系统可以处理具有更高优先级的任务。在一致性阶层BCC2和ECC2中支持相同优先级的任务。

相同优先级的任务的启动取决于它们的激活顺序,处于waiting状态的extended tasks不会阻塞相同优先级的后续任务的启动。被抢占的任务被认为是当前优先级列表中的第一个(最早的)任务。从waiting状态释放的任务将被视为其优先级的就绪队列中的最后一个(最新的)任务。

下图显示了使用每个优先级级别的调度程序的示例。

几个优先级不同的任务处于ready状态;即3个优先级为3的任务,1个优先级为2的任务,1个优先级为1的任务,加上2个优先级为0的任务。

根据请求的顺序,等待时间最长的任务显示在每个队列的底部。处理器刚刚处理并终止了一个任务。调度器选择下一个要处理的任务(优先级3,第一个队列)。优先级2的任务只能在所有优先级更高的任务离开running和ready状态后才能运行,即启动,然后从队列中移除,要么因为终止,要么因为过渡到waiting状态。

下述基本步骤是确定下一个要处理的任务所必需的:

  • 调度器搜索处于ready/running状态的所有任务
  • 从处于ready/running状态的任务集中,调度器确定具有最高优先级的任务集
  • 在处于ready/running状态且优先级最高的任务集中,调度器查找最早的任务
  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值