【FreeRTOS学习笔记】时间片
本节用于整理freertos中时间片的实现方式,以及测试程序的思路:
1.freertos中,由于遍历就绪链表时,使用的是索引节点,并且在结束后会将索引指向下一个;
这样每次遍历就绪链表选取节点的时候,会轮流选取节点。这样同优先级平分就实现了。
有一个细节,每次时钟中断到来,都会启动任务切换,那么平分时间的精度其实就是时间片的大小。
2.测试程序该如何展示高优先级独占、低优先级平分CPU呢?
(1)创建几个任务?优先级如何?
想要展示高优先级独占,那么前提是有两种优先级的任务,简单设为1和2吧。
想要展示低优先级平分,前提是至少有两个低优先级任务。
那么就创建Task1和Task2为1优先级任务,Task3为2优先级任务;
(2)任务实体怎么做,才能直观地通过逻辑分析仪看出独占和平分?
由于Task3的优先级最高,只要它不阻塞,CPU就一定分给它,其他任务一定得不到CPU;
所以独占在插入就绪链表和遍历就绪链表的方式定下来时,已经实现了;
为了能看到任务1和任务2在平分时间片,我们在Task3中,使用非阻塞延时:
为了能看到在Task3进入延时时,Task1和Task2平分时间片,最简单的方法是使用阻塞延时;
这样任务自身不让出CPU,只等待SysTick到来时进行任务让步;如下图:
3.运行结果如下图:
4.分析FreeRTOS中SysTick服务的细节差异;
在本人写的代码中,每次SysTick到来都会使用任务让步,而实际显然不需要每次SysTick都进行让步;
在rtos中,只有就绪列表中最高优先级比当前任务优先级高时,才会进行调度:
5.更改思路:
(1)修改时钟递增的服务例程,只有更高优先级的任务被唤醒时,才进行调度
(2)freertos里根据返回值来是否使用任务让步,直接在时钟递增的服务例程里用也行,但估计为了分层;
代码:
在单步调试过程中,发现没有更高优先级被唤醒时确实不会调度,但在那个过程中,低优先级的任务就不能以时钟SysTick为精度进行平分了;
效果展示:
有利有弊吧,实时性降低了,但切换用的时间片少了。
想要再实现时间片级的调度,只需要增加判断,当最高优先任务不止一个时,也进行调度即可。代码如下:
观察现象,确实产生了时间片级的调度:
在FreeRTOS中,相关的宏有两个,抢占preemption 和 时间片 slicing