• Autosar模块介绍:AutosarOS(2)


    上一篇 | 返回主目录 | 下一篇

    1 任务管理(Task Management)

    1.1 任务基本概念及分类

    任务作为系统调度的基础(OS调度以任务(Task)为单位)、功能/动作执行的载体(实现过程中作为执行实体(Runnable)),按调度方式可以分为周期任务(Periodic Task)、初始化任务(Init Task)、事件任务(Event Task)等

    任务只是作为功能执行过程的载体,并没有严格定义,存在其他理解也并不能认为错误
    #1、周期任务(Periodic Task):按照设定好的固定事件间隔进行任务调度
    #2、初始化任务(Init Task):上电后在进行周期任务调度之前,只执行一次的任务
    #3、事件任务(Event Task):通过事件设置触发而执行任务

    根据不同的软硬件需求,定义了四种符合类(Conformance Class, CC)(如下表),四种符合类之间兼容性如下图。

    属性BCC1BCC2ECC1ECC2
    多次任务激活请求NoYesNoYes(BT),No(ET)
    每个任务优先级存在的任务个数1≥11≥1
    基本任务YesYesYesYes
    扩展任务NoNoYesYes

    ##符合类(Conformance Class, CC)与基础任务/扩展任务概念之间相互相对独立(切忌混淆理解)
    ##详细描述见OSEK标准(此处只对部分特性进行了描述):ISO17356_Part3_OSEK-VDX Operating System (OS).pdf

    1.1.1 基础任务(Basic Task, BT)

    基础任务存在三种状态:准备(Ready)、运行(Running)、挂起(Suspend)。与扩展任务显著区别是不能进入阻塞状态,也就是不能等待OS的事件,并且在执行完成后会释放所占用的资源。基本过程为:Suspend-> Ready-> Running-> Suspend(循环)

    ##相对于扩展任务优势:对于运行时上下文(RAM)的适度需求

    1)、生成的代码格式:

    TASK(BasicTask)
    {
        ...
        /*User Code*/
        ...
        TerminateTask();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2)、调度方式:

    1.1.2 扩展任务(Extended Task, ET)

    扩展任务存在四种状态:准备(Ready)、运行(Running)、挂起(Suspend)、等待(Waiting)。与基础任务显著区别是可以进入阻塞状态,也就是可以等待OS的事件,并且一般不会回到挂起状态。基本过程为:Suspend-> Ready-> Running-> waiting-> Ready (循环)

    ## 包含多个同步点,没有同步请求的麻烦,当进一步的工作出现信息缺失时,任务切换至等待状态。

    1)、生成的代码格式:

    TASK(xxxx)
    {
      EventMaskType ev;
      for(;;)
      {
        (void)WaitEvent(xxxx|xxxx); /* PRQA S 3417 */ /* MD_Rte_Os */
        (void)GetEvent(xxxx, &ev); /* PRQA S 3417 */ /* MD_Rte_Os */
    (void)ClearEvent(ev & (xxxx|xxxx);
    
    If((ev&xxxx) != (EventMaskType)0)
    {
    Runnable0;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2)、调度方式:

    1.2 系统定时器(System Ticks)

    系统定时器(OS Counters)作为软件任务(Task)的基础(或者说类似于心脏对于人体的作用),由此触发可以进行任务的周期调度、事件触发等等

    1.2.1 硬件定时器(Hardware Counts)

    由硬件(如定时器)驱动的计数器,该计数值由外围设备“硬件”处理。一般通过高精度的硬件定时器作为系统的驱动定时器(但是一般该定时器的中断优先级不会设置的特别高,因为其驱动的Task的优先级低于中断优先级)。

    1.2.1 软件定时器(Software Counts)

    通过调用OS API(IncrementCounter)实现递增的计数器,计数值由操作系统维护“软件”。

    1.3 闹钟与事件(Event And Alarm)

    1.3.1 闹钟(Alarm)

    闹钟(Alarm)本质就是一个定时器,在到达设定的时间点时,就可以进行相应的操作(如设置事件、触发任务、进入回调等)。

    #Alarm与事件、Task、回调函数等均只能是一对一关系,此处区别于调度表

    1.3.2 事件(Event)

    事件是由操作系统管理的对象。事件机制只提供给拓展任务(ET),是任务状态切换的一种机制(等待状态(Waiting)与就绪状态(Ready)、运行状态(Running)),是一种同步的方法。

    ##此概念与扩展任务(ET)相关,在进入扩展任务后,扩展任务就不会再次退出,功能的执行通过设置事件进行调用(此处可参考扩展任务章节内容)

    1.4 调度表(Schedule Table)

    闹钟(Alarm)触发方式只能存在一对一,因此引入了调度表的概念。调度表通过在一段时间内设置多个触发点(Expiry Point),然后在每个触发点可以设置多个事件、任务等避免了闹钟(Alarm)的缺点(因此可用于核间任务同步)。

    调度表存在三个基本参数:持续时间(Duration)、触发点(Expiry Point)、偏移量(Offset),触发点通过设置相对于开始点的偏移量得到,调度表可以通过设计持续时间指定结束时间。

    # 调度表的调用存在两种模式:单次调用、重复调用(循环调用)

    1.6 优先级(Task Priority)

    任务优先级(优先级)决定下一个准备就绪的任务将被转移到运行状态。为了提高效率,不支持动态优先级管理。因此,任务的优先级是静态定义的,即用户在执行时不能更改它。

    处理步骤:
    1)、调度程序搜索处于就绪/运行状态的所有任务
    2)、从处于就绪/运行状态的任务集中,调度程序确定具有最高优先级的任务集
    3)、在处于就绪/运行状态且优先级最高的任务集中,调度器找到最老的任务

    #优先级处理原则:
    1)、相同优先级的任务根据激活顺序启动,处于等待状态的扩展任务不会阻塞相同优先级的后续任务的启动
    2)、被抢占的任务被认为是其当前优先级的就绪列表中的第一个(最老的)任务
    3)、从等待状态释放的任务被视为其优先级的就绪队列中的最后(最新)任务

    ##特定情况下会修改任务执行的优先级

    1.7 任务调度策略(Scheduling policy)

    可抢占性(Preempt)用于描述任务执行过程中是否可以被优先级更高的任务打断,将任务划分为可抢占任务(Preemptive Task)、不可抢占任务(Non-preemptive Task),由此引申出几种调度方式:抢占方式调度(Preemptive Schedule)、非抢占方式调度(Non-preemptive Schedule,也被称作协作调度)、混合抢占式调度(Mixed preemptive scheduling)。

    1.7.1 完全抢占式调度

    当一个高优先级的任务准备就绪时,全抢占调度将使正在运行的任务进入就绪状态。保存任务上下文,以便被抢占的任务可以在被抢占的位置继续执行。

    #具有以下特点:
    1)、在完全抢占式调度中,延迟时间与低优先级任务的运行时间无关
    2)、某些限制与保存上下文所需的(RAM-)内存空间的增加以及任务之间同步所需特性的复杂性的增强
    3)、理论上每个任务都可以在任何位置重新调度,因此对与其他任务联合使用的数据的访问必须同步

    1.7.2 非抢占式调度

    非抢占式调度对任务可能的时间要求施加了特定的约束。特别是正在运行的低优先级任务的不可抢占部分会将高优先级任务的启动延迟到下一个重新调度点。

    #高优先级任务在与低优先级任务调度存在冲突时,高优先级任务也可能因此造成较大延时

    1.7.3 混合抢占式调度

    可抢占任务和不可抢占任务在同一个系统上混合使用,那么得到的策略称为“混合抢占”调度。在这种情况下,调度策略取决于正在运行的任务的抢占属性。如果正在运行的任务是不可抢占的,则执行非抢占调度。如果正在运行的任务是可抢占的,则执行抢占调度。

    2 中断(Interrupt)

    在整个系统中Task的优先级最低,对于时间保护类中断以及Category 0通常以错误勾子函数(ErrorHoook)形式处理,用户可以操作的两种中断类型为:一类中断、二类中断,除此之外提供了可以禁用两类中断的接口函数(可通过禁用中断防止执行过程被打断,常被用于资源保护等场景)。

    2.1 一类中断(Category 1)

    此类中断服务程序不能够使用OS提供的系统服务,当中断执行完成之后则会重新跳转至产生中断的地方继续执行,不会影响到任务的执行,因此占用系统资源较少。且不支持中断的嵌套,但是支持内联汇编的方式实现嵌套

    2.2 二类中断(Category 2)

    该类中断则可以调用部分OS系统服务,如激活任务或者设置事件等(如但是TerminateTask等就不被允许)。除此之外它支持中断的嵌套。

    ##如图二类中断可调用OS资源,在中断内激活优先级高于TaskA的任务TaskB,则在执行完TaskB后进行返回TaskA继续执行;或者执行完直接返回TaskA中断位置继续执行

    2.3 中断禁用

    EnableAllInterrupts/ DisableAllInterrupts:禁止所有中断(包括1类和2类中断)
    1)、典型用法是保护短的临界段
    2)、不允许从这样的保护临界段内的中断返回,即禁用与启用配套使用
    SuspendAllInterrupts/ ResumeOSInterrupts:挂起所有中断(包括1类和2类中断)
    SuspendOSInterrupts / ResumeOSInterrupts:挂起2类中断

    3 优先级(Priority)

    优先级用于处理并发任务、中断以等的执行先后顺序问题,高优先级任务、中断可打断低优先级相关执行,通过此方式可保障及时处理更为重要的内容。具体中断、任务的优先级如下图所示,在相关分类下可再设置优先级以保障内部的处理顺序。

    上一篇 | 返回主目录 | 下一篇

  • 相关阅读:
    el-input: 把不符合正则校验的值动态清空,只保留符合的值
    对称加密,非对称加密,数字证书以及实例运用-Https加密方式
    封装公用svg图标
    自动化运维-批量安装Linux操作系统
    Greenplum-备份与恢复
    Jekyll如何自定义摘要
    几个算法题解
    2022中国国际防伪溯源技术展览会 | 防伪溯源 | 智慧包装 | 安全印刷
    linux-OpenSSL升级
    【redis】从高并发场景下超卖问题到redis分布式锁
  • 原文地址:https://blog.csdn.net/u012406840/article/details/127842745