焦溪翠冠梨做的网站,南昌p2p网站建设,家装设计公司排行榜,iis 怎么绑定网站二级目录先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表#xff08;没理解透#xff0c;继续更新#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制#xff0c;具有… 先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表没理解透继续更新 OSEK与FreeRTOS在任务调度上最大的区别在于FreeRTOS是基于全抢占任务调度和时间片轮转调度机制具有并发和并行的能力。而OSEK主要以调度表机制和Alarm机制触发任务不具备并行的能力。最大的相同点是都是根据优先级高低的全抢占调度机制OSEK可选非全抢占。 调度表 调度表被称为任务控制块表Task Control Block TableTCB Table它是一个静态定义的数组用于存储系统中所有任务的信息。一个调度表被划分成多个到期点Expiry Points每个到期点对应一个时间片每张调度表中所有要执行的任务都放在一个静态数组里。当一个到期点到达时调度器会检查该到期点对应数组里的就绪任务之后根据任务的优先级进行全抢占任务调度。 每个任务在调度表中都有一个对应的任务控制块TCB包含了任务的相关信息如任务的优先级、堆栈指针、状态等。调度表中的任务按照其优先级从高到低的顺序进行排列。优先级较高的任务的任务控制块位于调度表数组的较低索引位置优先级较低的任务位于较高索引位置。 OSEK 中任务切换不像 FreeRTOS 的就绪列表那样使用双向链表而是通过遍历数组来选择下一个任务进行执行。OSEK中任务的优先级数值越小优先级越高。 调度表中的任务按照任务的优先级放在一个静态数组里要想区分在每个到期点执行什么任务就要根据任务的状态信息来区分每个到期点被执行的时候会先将当前到期点将要执行的任务从原来的Suspended状态切换到Ready状态这样一来在调度器调度任务的时候就只会执行Ready状态下的任务之后再根据优先级高低进行任务的调度。 在OSEK的调度表机制中调度表是一个静态数据结构可以将调度表理解为固定时间片轮转调度和FreeRTOS的时间片轮转调度机制相似但又不同。 调度表中的到期点 Expiry Points 是通过调度表定义的系统时钟中断触发的通过配置系统时钟中断的频率来控制到期点的触发频率。当系统时钟中断发生时调度器会根据到期点的时间要求和任务的截止时间进行任务调度和切换。 OSEK和FreeRTOS在时间片轮转调度最大区别在于FreeRTOS的时间片轮转调度机制是就绪列表中相同优先级任务根据滴答时钟触发的中断轮番获取CPU的控制权而OSEK的调度表是基于调度表定义的每个到期点实现任务的切换之后在每个到期点的时间片中又按照全抢占调度机制调度任务。 除此之外如果调度表中到期点前的任务没有执行完到期点将要执行的任务优先级高于没有执行完的任务则实施全抢占任务调度没有执行完的任务会被堆栈保存上下文在下一个任务周期执行完上次没有执行完的部分。 如果调度表中到期点将要执行的任务优先级低于还未执行完的任务那么调度器会继续执行当前正在执行的任务。所以在开发过程中就要注意如果遇到调度表中到期点将要执行的任务优先级低于还未执行完的任务要在未执行完的任务最后面加一个 TerminateTask 的函数这个函数可以执行切换任务的动作。 Alarm 如果说调度表是基于时钟触发的中断之后利用调度器执行和切换任务。Alarm是基于时钟触发的事件之后利用调度器在特定的时间点触发与之关联的任务。 Alarm是一种定时机制也就是在特定的时间点触发与之关联的任务的执行他与FreeRTOS的全抢占调度的区别在于FreeRTOS的全抢占调度是没有时间概念的只要有高优先级来那就去抢任务的触发不会遵循一种时间精度上的调度而Alarm是可以精确时间周期的触发任务虽然任务之间是全抢占但当高优先级任务执行完会切回到没有执行完的任务。 而Alarm与调度表的区别在于首先调度表是一种静态的任务调度方式在调度表中每个任务都被分配了一个固定的时间片来执行如果你没有执行完并且任务优先级低很抱歉等下一次轮到你再说吧。 Alarm触发的任务是直接由外部事件驱动的可以理解为FreeRTOS中全抢占调度任务对任务的抢占能力极强对于任务的优先级要求比较高。而调度表是由一个固定的时间片触发调度器控制的类似于时间片轮转调度抢占能力比较弱要求的是你只要在固定的时间执行了这个功能就可以了即便没有执行完下一个周期执行也可以对于任务的优先级要求不需要很高。 在 Rte_Start 开启时启用alarm 在Rte_Stop时停止alarm 调度表中如果时间没有到到期点任务就执行完成剩下的时间执行空闲任务