任务优先级创建完为什么就是Ready状态,如果优先级高的话能直接进入Running状态吗?

OS规范进行了部分调整 作者:邓孔宏 任务优先级管理 任务优先级类别 任务优先级分为两个类别: 基础任务优先级:只有running,suspendedready三个状态。 基础任务优先级在三种情况下释放處理器资源:任务优先级结束;操作系统切换到高优先级任务优先级;中断发生导致处理器切换到一个中断服务程序ISR 拓展任务优先级:較之基础任务优先级,多了一个waiting状态拓展任务优先级被允许调用系统服务WaitEvent。 任务优先级状态及转换 任务优先级状态 running 在任何时间点只有一個任务优先级能处于running状态CPU将会被分配到该任务优先级,该任务优先级的指令将被执行 ready 所有的任务优先级要转换为running状态都必须先处于ready状態,处于ready状态的任务优先级只需等待分配处理器就能转换为running状态调度器决定哪一个ready状态的任务优先级将是下一个执行的任务优先级。 suspended 一個新的任务优先级被设置成ready状态通过一个系统服务AUTOSAR操作系统将确保任务优先级从第一条指令开始执行。 (在多重激活情况下任务优先級激活不会立即改变任务优先级状态。如果任务优先级不是suspended状态激活只会被记录,晚些时候被执行) start: 一个ready任务优先级被调度器选择詓执行。 preempt: 调度器决定去执行另一个任务优先级使得running任务优先级进入ready状态。 terminate: running任务优先级通过调用系统服务导致它的状态转换为suspended状态 (注:任务优先级只自己结束自己) 以下两个状态转换为拓展任务优先级特有 wait: 通过一个系统服务引起状态转换到waiting状态,waiting任务优先级等待┅个事件以能够继续操作。 release: 至少一个任务优先级等待的事件发生 激活一个任务优先级 使用操作系统服务ActivateTask或ChainTask激活任务优先级。 AUTOSAR OS不支持類C参数传递当启动一个任务优先级时 任务优先级激活的多重请求 依据一致性类别,一个基础任务优先级可以被激活一次或多次“任务優先级激活的多重请求”意味着AUTOSAR OS接收和记录已经被激活任务优先级的平行激活。 并行的多重请求的数目被定义在基础任务优先级的一个特萣的属性里在系统生产阶段如果没有达到多重请求的最大数目,那么请求是排队的基础任务优先级激活的请求按照激活顺序里的优先級排序。 任务优先级切换机制 调度器:决定哪一个任务优先级应该开始运行和触发所有必须的AUTOSAR OS内部的活动的实体被称作调度器 在AUTOSAR OS 里调度器是一个资源。依据实现的调度策略每当要进行一次任务优先级切换时,调度器会被激活任务优先级可以保留调度器来避免任务优先級切换直到调度器被该任务优先级释放。 任务优先级优先级 0是最低优先级数值越大优先级越高。 任务优先级的优先级是静态定义的在運行时不可以改变。但是在特殊情况下操作系统可以给一个任务优先级一个定义的更高的优先级(详见优先级上限协议)。 BCC2和ECC2支持相同優先级有多个任务优先级 在相同优先级的任务优先级的开始顺序依据激活的顺序,通过拓展的任务优先级进入waiting状态不会阻塞相同优先级裏后面的任务优先级的开始被抢占的任务优先级被认为是在它当前优先级的ready清单里第一个任务优先级(最老的任务优先级)。 从waiting状态里釋放的任务优先级被当作它的优先级的ready序列里的最后的任务优先级(最新的) 决定下一个要执行的任务优先级的基本的步骤: 调度器搜索所有的处于ready/running状态的任务优先级 从处于ready/running状态中的任务优先级集合,调度器判定拥有最高优先级的任务优先级集合 在拥有最高优先级处于ready/running状態的任务优先级集内调度器找到最老的任务优先级。 调度策略 全抢占调度 全抢占调度意思是一个目前处于running状态的任务优先级可能在任何嘚指令处被重调度通过操作系统预置的触发条件的发生。全抢占调度会使得running任务优先级转化为ready状态只要一个更高的优先级的任务优先級处于ready状态。任务优先级环境被保存以便被抢占的任务优先级可以在被中断的位置继续 对于全抢占调度延迟时间与低优先级任务优先级嘚运行时间无关。一些限制关于为了保存环境要求增加的RAM内存和为了同步任务优先级而必须的特征的增强的复杂性由于理论上一个可以茬任何位置被重调度,对于与其它任务优先级共享的数据的访问应该被同步 如果一个任务优先级的代

}

FreeRTOS 初探之任务优先级管理解析

任务优先级:每个执行线程都被成为任务优先级。

每个任务优先级都是在自己權限范围内的一个小程序
2、通常会运行再一个死循环,不会退出

 
1、必须返回void
2、带有一个void指针参数
3、FreeRTOS任务优先级不允许以任何方式从实現函数中返回(绝不能有return,也不能执行到函数尾部)
4、一个任务优先级不再需要,可以显式地将其删除
5、一个任务优先级函数可以用來创建若干个任务优先级(创建出的任务优先级均是独立的执行实例,有属于自己的栈空间以及属于自己的自动变量(栈变量))
 /*任务優先级通常实现在一个死循环中*/
 /*此处存放完成任务优先级功能的代码*/
 /*若任务优先级的具体实现会调出上面的死循环,则次任务优先级必须茬函数运行完之前删除
 传入NULL参数表示删除的是当前任务优先级*/
 

在应用程序中,FreeRTOS如何为各任务优先级分配处理时间

 

在任意给定时刻,FreeRTOS如何选择任务优先级投入运行

 

系统行为">任务优先级优先级如何影响系统行为。

 

 
应用程序可以包含多个任务优先级
如果:
运行程序的CPU只有一个核(core) →→
在任意给定时间,只会有一个任务优先级被执行→→
一个任务优先级可以有1个或2个状态:
1、运行状态(Running State)
2、非运行状态(Not Running State)



挂起状态的任务优先级对于调度器而言是不可见的
大多数应用程序中都不会用到挂起状态。


则这个任务优先级处于就绪。处于就绪态(ready)的任务优先级能够被运行只是“准备(ready)”运行,而当前尚未运行


切换入/切入(switched in) 、交换入(swapped in):任务优先级从非运行态转移到运行态。
切换出/切出(switched out)、交换出(swapped out):任务优先级从运行态转移到非运行
FreeRTOS的调度器是能让任务优先级切入切出的唯一实体。
为任务优先级切实有用我们需偠通过某种方式来进行事件驱动
一个事件驱动任务优先级只会在事件发生后触发工作(处理)而在事件没有发生时是不能进入运行态的。
采用事件驱动任务优先级的意义:任务优先级可以被创建在许多不同的优先级上并且最高优先级不会吧所有的低优先级任务优先级饿死。

实例4:使用阻塞态实现延时

 
通过调用vTaskDelay( API函数来代替空循环)
函数原型:
 
xTicksToDelayL延时多少个心跳周期。调用该延时函数的任务优先级将进入阻塞态经延时指定心跳周期数后,在转移到就绪态
例:当某个任务优先级调用vTaskDelay(100)时,心跳计数值为10000则该任务优先级将保持在阻塞态,知道心跳计算到10100 常数portTICK_RATE_MS:用来将以毫秒为单位的时间值转换为以心跳周期为单位的时间值。
 /*延时一个循环周期让任务优先级在延时器件保持在阻塞态。延时时间以心跳周期为单位常量portTICK_RATE_MS可以用来在猫喵和心跳周期之间相互转换。*/
 

 
 

备注:
1.usStackDepth——告诉内核需要为任务优先级分配多大的栈空间单位:字(word)。栈深度乘以栈宽度的结果千万不能超过一个size_t类型变量所能表达的最大值

2.uxPriority——指定任务优先级执行的优先级取值范围:0(最低优先级) to configMAX_PRIOPITIES - 1 (最高优先级)。
configMAX_PRIOPITIES:由用户定义的常量优先级号无上限(除了受限於采用的数据类型和系统的有效内存空间),但最好使用实际需要的最小数值以避免内存浪费如果uxPriority的值超过了(configMAX_PRIORTIES -1),将会导致实际付给任務优先级的优先级会自动封顶到最大合法值
3.pxCreatedTask——用于传出任务优先级的句柄。这个句柄将在API调用中对该创建出来的任务优先级进行引用如改变优先级,删除任务优先级
如果应用程序中不会用到这个任务优先级的句柄,则可以设为NULL

如何创建一个或多个任务优先级的实例。

 

实例1:创建单层任务优先级

 
 "Task 1", /*任务优先级的文本名字,只会在调试中鼡到*/
 1000, /*栈深度-大多数小微MCU会使用的值会比此值小得多*/
 1, /*此任务优先级运行在优先级1上*/
 /*若一切运行正常 main()函数不应该会执行到此处,
 但如果执行箌了此处则很可能是内存堆不足导致空闲任务优先级无法创建*/
 

实例2:实现嵌套任务优先级。

 
 /*如果运行到本任务優先级代码表明调度器已经启动。在进入死循环之前创建另一个任务优先级*/
 

 
实例1和2中的Task1和2实现的功能均是一樣的,区别在于打印的字符串不一样这种重复性可以通过创建同一任务优先级代码的两个实例来去除,这时任务优先级参数就可以用來传递各自打印输出字符串。

实例3:任务优先级函数(vTaskFunction)代替了vTask1和vTask2, 任务优先级参数被强制转换为char*以得到任务优先级需要打印输出的字符串

 
 /*需要打印输出的字符串从入口参数闖入。强行转换为字符指针*/
/*定义将要通过任务优先级参数传递的字符串定义为const,且不是在栈空间上以保证任务优先级执行师也有效*/
 

如何改变一个已创建任务优先级的优先级。

 

应用程序在文件 FreeRTOSConfig.hconfigMAX_PRIORITIES的值即是最多可以具有的优先级
徝越大内核花销的内存空间就越多。建议将该值设置为能够用到的最小值
任意数量的任务优先级可以共享同一个优先级——以保证最夶设计弹性。
优先级号0表示最低优先级
有效的优先级号范围从0到(cinfigMAX_PRIORITES -1)
调度器保证总是在所有可运行的任务优先级中选择具有最高优先级嘚任务优先级进入运行态
如果被选中的优先级上具有不止1个任务优先级调度器会轮流执行这些任务优先级。
任务优先级在时间片起始時刻进入运行态在结束时刻退出运行态。
t1与t2之间的时段就等于1个时间片
心跳(tick,时钟滴答)中断的周期性中断:调度器需要在每个时間片的结束时刻运行自己本身才能够选择下一个运行任务优先级
时间片长度:通过心跳中断的频率设定
心跳中断频率:由FreeRTOSConfig.h中时间配置常量configTICK_RATE_HZ进行配置。

FreeRTOS API函数调用中指定的时间总是以心跳为单位的时间值转化而来(单位:ms)有效精度依赖于系统心跳频率。

 

 

空闲任务优先级何时运行可以用来干什么。

 
}

我要回帖

更多关于 任务优先级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信