FreeRTOS和ThreadX的任务调度

FreeRTOS的任务调度

       通过将 configUSE_PREEMPTIONconfigUSE_TIME_SLICING 都设置 1,FreeRTOS可以同时支持基于优先级可抢占的调度和相同优先级任务时间片调度。

        在这种配置方式下,任务会在以下时间点发生调度:

1、低优先级任务发送消息、事件或者信号量可以导致高优先级任务进入运行态。

     该低优先级任务的发送消息、事件、信号量函数返回时,代表它再次进入运行态,也表示由其引起的高优先级任务执行已经完毕。

2、中断服务程序的发送消息、事件或信号量可以导致高优先级任务进入运行态。

3、时间片调度是由tick中断触发的,前提是中间没有发生其它引起调度操作或事件。

      情况一:2个相同优先级的任务,Task_A 处于运行态,Task_B 处于ready态。

         (a)此时发生了一个中断,或者 Task_A 往 Task_B 发送一个消息,都会触发任务调度,调度程序会使相同优先级的下一个任务,即 Task_B 获得运行,而 Task_A 进入ready态,虽然 Task_A 还没有运行完一个tick周期。

         (b)当Task_A触发了一个更高优先级任务获得运行,该更高优先级任务执行完毕后,虽然Task_A还没有运行完一个tick周期,但调度程序会使相同优先级的下一个任务,即Task_B获得运行,而Task_A进入ready态。

      情况二:2个相同优先级的任务 Task_A 和Task_B都处于ready态,一个更高优先级的 Task_C处于运行态。

            当 Task_C 执行完毕,Task_A获得运行,接着来了一个tick中断,调度程序会使相同优先级的下一个任务,即 Task_B 获得运行,而 Task_A 进入ready态,虽然到此时为止,Task_A运行的时间没有达到一个tick周期。

因此,这里的时间片调度是无法保证相同优先级任务获得相同CPU运行时长,这与时分操作系统不同。

 

ThreadX的线程调度

  • 默认是基于优先级的可抢占调度方式。
  • 对于同优先级线程,默认是FIFO调度方式,当然,也可以配置为时分(time-slicing)调度方式。
  • 对于时分调度方式
  1. 时分值可以每个线程单独分配。
  2. 当被抢占后,能够在同优先级线程中优先获得被抢占前未执行完成的时间,即能保证同优先级线程获取的执行时间和设置值一致。比如:时间片统一设置为 10 ms的同优先级 T 线程 A、B、C;在A运行 3 ms时 CPU 被更高优先级线程抢占,当优先级T的线程再次获的CPU运行资源时,线程A会优先获得剩余的 7ms CPU资源。这一点与FreeRTOS的调度方式不同,ThreadX的同优先级时分是真的时分。

你可能感兴趣的:(嵌入式软件开发,freertos)