1. OSEK的任务调度机制
如下图所示,在调度表中有很多 Expiry Points,下面是一个20ms的调度表。有每2.5ms触发一次2.5ms的TASK,以及其他按照时间的TASK触发;并且根据配置也可以看出,所有的任务都是基于全抢占模式触发的,也就是说,如果任务没有执行完,但是有更高优先级的任务进来了,此时,旧的任务将挂起,先执行新来的高优先级任务,等到高优先级任务执行完,再去执行旧的低优先级任务;但是这样触发有一个前提,第一个是两个任务都是在同一个Expiry Points点触发,此时按照全抢占模式处理。还有一个就是在达到期点 Expiry Points 时,旧的任务没有执行完,但是新的任务优先级又比较低,此时依旧会处理旧的高优先级任务,直到完成,新任务会等待下一个调度周期才会获得执行机会。除此之外,如果新的任务优先级比旧的任务的优先级高,会执行高优先级任务,旧的低优先级任务会等到下一个周期再去执行。
理解一个概念,调度表的周期性任务与alarm周期性任务,假设调度表任务的周期性与alarm任务的周期性是一致的,并且在各个周期性任务执行后,有更高优先级的周期性任务。如果到了触发时间,有高优先级的任务抢占了低优先级的任务,调度表触发的任务会将任务挂起,之后等到下一个周期再重新执行(前提条件是达到了Expiry Points),而alarm触发的任务是等高优先级任务执行完,就立即执行低优先级任务。
OSEK与FreeRTOS在任务调度上最大的区别在于,FreeRTOS是基于全抢占任务调度和时间片轮转调度机制,具有并发和并行的能力。而OSEK主要以调度表机制和Alarm机制触发任务,不具备并行的能力。最大的相同点是都是根据优先级高低的全抢占调度机制(OSEK可选非全抢占)。
2. 调度表
调度表被称为任务控制块表(Task Control Block Table,TCB Table),它是一个静态定义的数组,用于存储系统中所有任务的信息。一个调度表被划分成多个到期点Expiry Points,每个到期点对应一个时间片,每张调度表中所有要执行的任务都放在一个静态数组里。当一个到期点到达时,调度器会检查该到期点对应数组里的就绪任务,之后根据任务的优先级进行全抢占任务调度。
每个任务在调度表中都有一个对应的任务控制块(TCB),包含了任务的相关信息,如任务的优先级、堆栈指针、状态等。调度表中的任务按照其优先级从高到低的顺序进行排列。优先级较高的任务的任务控制块位于调度表数组的较低索引位置,优先级较低的任务位于较高索引位置。OSEK 中,任务切换不像 FreeRTOS 的就绪列表那样使用双向链表,而是通过遍历数组来选择下一个任务进行执行。OSEK中任务的优先级数值越小,优先级越高。
调度表中的任务按照任务的优先级放在一个静态数组里,要想区分在每个到期点执行什么任务,就要根据任务的状态信息来区分,每个到期点被执行的时候,会先将当前到期点将要执行的任务从原来的Suspended状态切换到Ready状态,这样一来,在调度器调度任务的时候,就只会执行Ready状态下的任务,之后再根据优先级高低进行任务的调度。
在OSEK的调度表机制中,调度表是一个静态数据结构,可以将调度表理解为固定时间片轮转调度,和FreeRTOS的时间片轮转调度机制相似,但又不同。
调度表中的到期点 Expiry Points 是通过调度表定义的系统时钟中断触发的,通过配置系统时钟中断的频率来控制到期点的触发频率。当系统时钟中断发生时,调度器会根据到期点的时间要求和任务的截止时间进行任务调度和切换。
OSEK和FreeRTOS在时间片轮转调度最大区别在于,FreeRTOS的时间片轮转调度机制是就绪列表中相同优先级任务根据滴答时钟触发的中断轮番获取CPU的控制权,而OSEK的调度表是基于调度表定义的每个到期点实现任务的切换,之后在每个到期点的时间片中,又按照全抢占调度机制调度任务。
除此之外,如果调度表中到期点前的任务没有执行完,到期点将要执行的任务优先级高于没有执行完的任务,则实施全抢占任务调度,没有执行完的任务会被堆栈保存上下文,在下一个任务周期执行完上次没有执行完的部分。
如果调度表中到期点将要执行的任务优先级低于还未执行完的任务,那么调度器会继续执行当前正在执行的任务。所以,在开发过程中就要注意如果遇到调度表中到期点将要执行的任务优先级低于还未执行完的任务,要在未执行完的任务最后面加一个 TerminateTask 的函数,这个函数可以执行切换任务的动作。
3. Alarm
如果说调度表是基于时钟触发的中断,之后利用调度器执行和切换任务。Alarm是基于时钟触发的事件,之后利用调度器在特定的时间点触发与之关联的任务。
Alarm是一种定时机制,也就是在特定的时间点触发与之关联的任务的执行,他与FreeRTOS的全抢占调度的区别在于,FreeRTOS的全抢占调度是没有时间概念的,只要有高优先级来,那就去抢,任务的触发不会遵循一种时间精度上的调度,而Alarm是可以精确时间周期的触发任务,虽然任务之间是全抢占,但当高优先级任务执行完,会切回到没有执行完的任务。
而Alarm与调度表的区别在于,首先调度表是一种静态的任务调度方式,在调度表中,每个任务都被分配了一个固定的时间片来执行,如果你没有执行完,并且任务优先级低,很抱歉,等下一次轮到你再说吧。
Alarm触发的任务是直接由外部事件驱动的,可以理解为FreeRTOS中全抢占调度任务,对任务的抢占能力极强,对于任务的优先级要求比较高。而调度表是由一个固定的时间片触发调度器控制的,类似于时间片轮转调度,抢占能力比较弱,要求的是你只要在固定的时间执行了这个功能就可以了,即便没有执行完,下一个周期执行也可以,对于任务的优先级要求不需要很高。
在 Rte_Start 开启时,启用alarm,
在Rte_Stop时,停止alarm
调度表中如果时间没有到到期点,任务就执行完成,剩下的时间执行空闲任务,
本文来源于网络,原文链接:https://blog.csdn.net/xiandang8023/article/details/134722145
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
TC3xx芯片GTM模块-CMU,CCM,TBU详解
TC3xx芯片GTM模块-TOM详解
AUTOSAR架构下PWM模块配置实践
TC3xx芯片GTM模块-TIM详解
AUTOSAR架构下ICU模块配置实践
TC3xx芯片电源管理系统PMS详解
TC3xx DMA模块详解
TC3xx芯片SMU模块详解
如何监控TC3xx芯片PFlash的ECC错误
TC3xx芯片RAM的错误检测
TC3xx芯片的总线内存保护
AUTOSAR架构下MCAL Modules软件分区问题分析
AUTOSAR架构下内部看门狗复位检测
TC3xx芯片时钟监控
TC3xx芯片电压监控和温度监控
嵌入式基础:环形缓冲区ring buffer
【OS】AUTOSAR架构下的中断和异常向量表
【OS】AUTOSAR Os是如何启动第一个Task的
编译链接专题第1篇-make和makefile介绍
编译链接专题第2篇-初识makefile结构
编译链接专题第3篇-初识makefile中的伪目标
编译链接专题第4篇-变量和变量的不同赋值方式
编译链接专题第5篇-预定义变量的使用
编译链接专题第6篇-变量的高级主题(上)
编译链接专题第7篇-变量的高级主题(下)
编译链接专题第8篇-条件判断语句
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式微信扫描二维码,关注我的公众号