【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