该文件从os223.pdf,依据AUTOSAROS规范进行了部分调整。作者:邓孔宏1.1任务管理1.1.1任务类别任务分为两个类别:·基础任务:只有running,suspended,ready三个状态。基础任务在三种情况下释放处理器资源:任务结束;操作系统切换到高优先级任务;中断发生导致处理器切换到一个中断服务程序ISR。·拓展任务:较之基础任务,多了一个waiting状态。拓展任务被允许调用系统服务WaitEvent。1.1.2任务状态及转换任务状态running在任何时间点只有一个任务能处于running状态,CPU将会被分配到该任务,该任务的指令将被执行。ready所有的任务要转换为running状态都必须先处于ready状态,处于ready状态的任务只需等待分配处理器就能转换为running状态。调度器决定哪一个ready状态的任务将是下一个执行的任务。suspended处于suspended的任务是被动的,可以被激活。waiting处于waiting状态的任务将不能继续执行,它将等待至少一个事件发生。任务转换terminatewaitpreemptstartactivatereleaserunningreadywaitingsuspendedactivate:一个新的任务被设置成ready状态通过一个系统服务。AUTOSAR操作系统将确保任务从第一条指令开始执行。(在多重激活情况下,任务激活不会立即改变任务状态。如果任务不是suspended状态,激活只会被记录,晚些时候被执行。)start:一个ready任务被调度器选择去执行。preempt:调度器决定去执行另一个任务,使得running任务进入ready状态。terminate:running任务通过调用系统服务导致它的状态转换为suspended状态。(注:任务只自己结束自己)以下两个状态转换为拓展任务特有wait:通过一个系统服务引起状态转换到waiting状态,waiting任务等待一个事件,以能够继续操作。release:至少一个任务等待的事件发生。1.1.3激活一个任务使用操作系统服务ActivateTask或ChainTask激活任务。AUTOSAROS不支持类C参数传递当启动一个任务时。任务激活的多重请求依据一致性类别,一个基础任务可以被激活一次或多次。“任务激活的多重请求”意味着AUTOSAROS接收和记录已经被激活任务的平行激活。并行的多重请求的数目被定义在基础任务的一个特定的属性里在系统生产阶段。如果没有达到多重请求的最大数目,那么请求是排队的。基础任务激活的请求按照激活顺序里的优先级排序。1.1.4任务切换机制调度器:决定哪一个任务应该开始运行和触发所有必须的AUTOSAROS内部的活动的实体被称作调度器。在AUTOSAROS里调度器是一个资源。依据实现的调度策略,每当要进行一次任务切换时,调度器会被激活。任务可以保留调度器来避免任务切换直到调度器被该任务释放。1.1.5任务优先级0是最低优先级,数值越大优先级越高。任务的优先级是静态定义的,在运行时不可以改变。但是在特殊情况下,操作系统可以给一个任务一个定义的更高的优先级(详见优先级上限协议)。BCC2和ECC2支持相同优先级有多个任务。在相同优先级的任务的开始顺序依据激活的顺序,通过拓展的任务进入waiting状态不会阻塞相同优先级里后面的任务的开始。被抢占的任务被认为是在它当前优先级的ready清单里第一个任务(最老的任务)。从waiting状态里释放的任务被当作它的优先级的ready序列里的最后的任务(最新的)。决定下一个要执行的任务的基本的步骤:·调度器搜索所有的处于ready/running状态的任务·从处于ready/running状态中的任务集合,调度器判定拥有最高优先级的任务集合·在拥有最高优先级处于ready/running状态的任务集内,调度器找到最老的任务。1.1.6调度策略1.1.6.1全抢占调度全抢占调度意思是一个目前处于running状态的任务可能在任何的指令处被重调度,通过操作系统预置的触发条件的发生。全抢占调度会使得running任务转化为ready状态,只要一个更高的优先级的任务处于ready状态。任务环境被保存以便被抢占的任务可以在被中断的位置继续。对于全抢占调度延迟时间与低优先级任务的运行时间无关。一些限制关于为了保存环境要求增加的RAM内存和为了同步任务而必须的特征的增强的复杂性。由于理论上一个可以在任何位置被重调度,对于与其它任务共享的数据的访问应该被同步。如果一个任务的代码段不能被抢占,那么它应该调用系统服务GetResource给调度器上锁。总之,重调度将在下面情况发生:·一个任务成功结束(TerminateTask、ChainTask)·激活一个任务在任务层·显式wait调用如果一个到waiting状态的调用发生(WaitEvent)·setting一个事件到一个waiting任务在任务层·释放资源在任务层上(ReleaseResource)·从中断层返回到任务层在中断服务程序运行期间,不执行重调度。1.1.6.2非抢占调度如果任务切换只通过一个选择的显式的定义的系统服务执行(显示的重调度点),这样的调度策略被描述为非抢占调度。非抢占调度强加特殊的约束在可能的任务的时间要求上。特别是一个低优先级的running任务的非抢占区域,延迟一个高优先级任务的开始到下一个重调度点。在非抢占任务情况下,重调度将在下面情况发生:·一个任务成功结束(TerminateTask、ChainTask)·显式的调用调度器(Schedule)·发生到waiting状态的转换(WaitEvent)非抢占调度系统的实现可能规定(导致重调度的)操作系统服务可能只能在最高任务程序层被调用(不是在子函数里)1.1.6.3任务组操作系统允许任务去结合抢占和非抢占调度方面通过定义任务组。对于有着同任务组内最高优先级一样或者更低优先级的那些任务,在这个任务组内的任务表现得像非可抢占任务:重调度将会发生在重调度点(理解:任务组内的低优先级任务不会被那些比他高的任务组外的任务抢占,因为它的优先级被调整到任务组内最高的优先级,任务组内外就表现的像非可抢占任务调度一样,因为没有任务会被抢占)。对于有着比任务组内最高优先级更高的优先级的那些任务,在任务组内的任务表现得像可抢占调度。通过使用内部的资源来定义组合。非可抢占任务是非常普遍使用的内部资源的概念;它们是拥有一个特别的分配了最高优先级的内部的资源的任务。非可抢占任务是一个特别的组合拥有一个资源有着相同的RES_SCHEDULER分配的优先级。1.1.6.4混合的抢占调度如果可抢占调度和非可抢占调度被混合在相同的系统里,产生的调度策略被称为“混合的抢占”调度。在这个情况里调度策略依据running任务的抢占属性值。如果running任务是非可抢占的,那么非可抢占调度被执行。如果running任务是可抢占的,那么抢占调度被执行。一个非可抢占任务的定义在一个全抢占操作系统里有意义·如果任务的执行时间同任务切换的时间处于相同量级·如果RAM被用来提供空间去保存任务环境比较经济,或者·如果任务不能被抢占。1.1.6.5选择调度策略软件开发者或系统集成者决定任务的执行顺序通过配置任务优先级和分配可抢占性作为一个任务属性。任务的类型(基础的或拓展的)独立于任务的调度类型(可抢占或非可抢占)。如果一个操作系统服务在运行,抢占和环境切换可能会被延迟直到服务完成。1.1.7任务的结束在AUTOSAR操作系统里,一个任务只可以自我结束。每个任务应该结束自己在它的代码的最后。不调用TerminateTask或ChainTask结束任务被严格禁止且导致未定义的行为。1.2任务管理APIStatusTypeActivateTask(TaskTypeTaskID)输入参数:TaskID任务引用返回Status值标准的:·没有错误,E_OK·TaskID太多次任务激活,E_OS_LIMIT拓展的:·任务TaskID无效,E_OS_ID一致性类别:全类别任务TaskID从suspended状态转换到ready状态。操作系统确保任务代码从第一条语句开始执行。该服务可能在中断层或任务层被调用。在调用该服务后的重调度依赖该调用的来源(ISR,非可抢占任务,可抢占任务)。如果返回E_OS_LIMIT激活被忽略。当一个拓展任务从suspended状态转换到ready状态所有的它的事件被清除。StatusTypeTerminateTask(void)返回Status值标准的:不返回到调用层拓展的:·任务仍然占据资源,E_OS_RESOURCE·调用在中断层,E_OS_CALLEVEL一致性类别:全类别该服务导致调用任务的结束。调用任务从running状态转换到suspended状态。分配到调用任务的内部的资源被自动的释放。其他的被该任务占据的资源应该被释放在调用TerminateTask之前。如果一个资源依然被占据在标准版本OS状态里该行为未定义。如果有着拓展状态的版本os被使用,服务在错误状态下返回,且提供一个可以被评估的状态。如果服务TerminateTask被成功调用,强制一个重调度。StatusTypeChainTask(TaskTypeTaskID)输入参数:TaskID返回Status值标准的:·不返回到调用层·TaskID太多次任务激活,E_OS_LIMIT拓展的:·任务TaskID是无效的,E_OS_ID·调用任务仍然占据资源,E_OS_RESOURCE·调用在中断层,E_OS_CALLEVEL一致性类别:全类别该服务导致调用任务的结束。在调用任务结束后,一个随后的任务TaskID被激活。使用该服务,确保随后的任务最早在调用任务结束后开始去运行。如果随后的任务与当前的任务完全相同,不会导致多重请求。该任务不会转换成suspended状态,但是会立即再一次变成ready状态。分配到调用任务内部的资源被自动释放,即使随后的任务同当前任务完全相同。其它的被调用任务占据的资源应该在ChainTask被调用之前被释放。如果一个资源仍然被占据在标准的状态里该行为是未定义的。如果调用成功,ChainTask不返回到调用层状态不能被评估。在错误情况下服务放回到调用任务且提供一个状态,用来被评估。如果返回E_OS_LIMIT激活被忽略。当一个拓展的任务从suspended状态转换为ready状态所有它的事件被清除。StatusTypeSchedule(void)返回Status值标准的:·没有错误,E_OK拓展的:·调用在中断层,E_OS_CALLEVEL·调用任务仍然占据资源,E_OS_RESOURCE一致性类别:全类别如果一个更高等级任务处于ready状态,任务的内部资源被释放,当前的任务被转化为ready状态,它的环境被保存,更高优先级的任务被执行。否则调用任务继续执行。重调度只会发生在这样的任务里,在系统生产阶段一个内部的资源分配到调用任务。对于这些任务Schedule使能一个处理器分配到,其它的有着比内部的资源的上限优先级更低或相等的优先级或比调用任务更高优先级的任务,在特定的位置里。当从Schedule返回,内部的资源再一次被获取。该服务对没有分配内部资源的任务(可抢占任务)没有影响。StatusTypeGetTaskID(TaskRefTypeTaskID)输出参数:TaskID对当前正在运行任务的引用返回的Status值标准的:·没有错误,E_OK拓展的:·没有错误,E_OK一致性类别:全类别该服务返回当前运行的任务的TaskID信息。允许在任务层,ISR层上和在几个hook程序里。这个服务意在被库函数和hook程序使用。如果TaskID不能被评估(不是当前运行的任务),服务返回TaskTypeINVALID_TASK。StatusTypeGetTaskState(TaskTypeTaskID,TaskS