• 263查看
  • 0回复

[Autosar] 玩转Autosar OS任务调度机制

[复制链接]


该用户从未签到

发表于 8-5-2024 19:12:09 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


在单片机的操作系统中,我们最常用的就是周期性任务。周期型任务调度一般是基于定时器,当定时器中断触发(常见为1ms触发一次),来执行任务切换。事件型任务是基于事件的,如接收到某个任务之后来触发某个任务。
开源操作系统

任务创建
在进入main函数后,我们一般会创建一个start_task,在这个任务中执行外设初始化及其他任务的创建。在μcos和freertos中,通过TaskCreate等创建完任务后,假如需要任务一直被调度(如周期性任务),需要加上while(1)或者for(;;)循环。常见的周期性任务如下所示。
玩转Autosar OS任务调度机制w1.jpg

任务调度
在任务创建时一般会赋予任务一个优先级,对于μcos-ii来说,每个任务的优先级不能一样(unique),对于freertos而言,多个任务可以共享同一个优先级。μcos和freertos任务创建后都会占用一个空闲位置。每次发生任务调度时,μcos通过查表法(预先设置好一个数组OSUnMapTbl[256],它表示最低位1所在的位置)查找到最高优先级,然后找到对应的TCB,最终找到最高的任务去运行,而freertos通过就绪链表来找到就绪的最高优先级任务。在时间片轮转中,是通过一个系统滴答的时钟中断,在中断中找到高优先级的任务。常见的ARM-M3/M4处理器,这个时候会再去触发PendSV中断,在PendSV中断函数中执行任务切换的上下文切换操作,在退出中断后,即可运行此时就绪的最高优先级的任务。
Autosar OS

原理介绍
Autosar OS的时间片轮转原理和开源OS类似,但由于任务都是静态配置的,因此可以生成一系列的表,直接查表获取当前需要运行的任务。周期任务的激活机制可以通过Alarm或者Schedule Table来实现。
Alarm
一个Alarm对应于1个任务。一般用硬件定时器(Gpt)作为操作系统的滴答时钟,Alarm需要引用一个与它在一个核上的操作系统的滴答时钟,当它的计数值达到时就可激活对应的任务。因此至少需要1个OS Counter + 多个Alarm来实现多个静态任务的激活机制。
Schedule Table
Schedule Table通过expiryPoint来激活任务。每个expiry point包含:1个或者多个的动作,这个动作可以用来激活任务,也可以用来设置事件;相对于Schedule Table起始的偏移量。因此对于多个任务,我们只需要用一个Schedule Table,里面定义多个expiry points即可实现任务激活机制。
玩转Autosar OS任务调度机制w2.jpg

Schedule Table可以通过调用一些服务函数进入不同的状态,如下图所示。

玩转Autosar OS任务调度机制w3.jpg

当Schedule Table处于SCHEDULETABLE_RUNNING状态时,操作系统就可以处理Schedule Table中的expiry points,因此在Rte启动时,我们需要调用StartScheduleTable来启动ScheduleTable。Schedule Table可以配置为单次(single-shot)或者重复运行(repeating)。顾名思义,单次运行就是运行一次就结束了,一般用于同一个触发源触发一些动作。而重复进行,即根据Schedule Table配置的duration重复运行,它会轮流处理每一个expiry point,即在处理完最后一个expiry point,又会回到第一个expiry point,这个对于周期性的任务调度就很有用处了!
Schedule Table VS Alarm
Schedule Table相对于Alarm来说还有一个最大的优势,就是不同核上的任务同步。由于一个Alarm只能对应一个task,而一个expriy point可以包含多个task,所以假如有两个核的任务需要做同步,那么假如用Alarm触发,将会很难做两个Alarm的同步。同时,对于很多域控来说,还需要通过Autosar StbM模块做时间同步来实现精确控制,最终需要修正任务的调度周期,也是通过调用SyncScheduleTable来实现的。
配置

Alarm

OsAlarmCounterRef:Alarm使用的OS Counter

OsAlarmActivateTaskRef:将要被这个Alarm激活的任务,从创建的task中选择

OsAlarmAutostart:配置这个选项表面Alarm将会在OS启动后根据application的模式自动启动。

OsAlarmAlarmTime:Alarm第一次超时的时间。

OsAlarmAutostartType:Alarm第一次超时的时间类型,ABSOLUTE:Alarm通过SetAbsAlarm函数启动;RELATIVE:Alarm通过SetRelAlarm函数启动

OsAlarmCycleTime:Alarm的循环时间,如果为0,则Alarm只运行一次(notcyclic)

Schedule Table
我们创建了两个任务:5ms和10ms,那么就会生成一个duration为10(任务周期的最小公倍数)的Schedule Table,然后生成3个expiry points,分别在offset为0(schedule table的0时刻)触发5ms和10ms的任务、offset为5只触发5ms的任务、offset为10触发5ms和10ms的任务。
玩转Autosar OS任务调度机制w4.jpg

玩转Autosar OS任务调度机制w5.jpg

OsScheduleTableDuration:Schedule Table的持续时间(长度,从第一个expirypoint到最后一个expiry point);

OsScheduleTableRepeating:ScheduleTable的类型,True:Repeating;False:Single-shot

OsScheduleTableCounterRef:Schedule Table使用的OS Counter;

OsScheduleTableAutostartType:ScheduleTable的启动类型,ABSOLUTE:通过StartScheduleTableAbs函数启动;

OsScheduleTblExpPointOffset:expiry point被执行的时间(相对于scheduletable的0点的偏移);

OsScheduleTableTaskActivation:scheduletable激活的task。

自启动任务
我们在freertos或者μcos中都会在StartOS前需要先创建一个用户任务,而Autosar OS也是如此。它要求在一个CPU中,至少要有一个AppMode。同时介绍<<EcuM功能分析及实现(上)之STARTUP>>启动时,为了拿回控制权,我们需要设置一个自启动的任务且EcuM_StartUpTwo作为任务中的第一个执行动作,这个其实也就是我们的用户任务。我们可以通过OsTaskAutoStart这个选项将任务和AppMode结合起来。
玩转Autosar OS任务调度机制w6.jpg

OsTaskAutostart:配置了这个选项,就表明任务在启动启动时就会被激活。

OsTaskAppModeRef:关联到AppMode.

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 08:02 , Processed in 0.219623 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.