zoukankan      html  css  js  c++  java
  • 嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度

    嵌入式OS入门笔记-以RTX为案例:六.RTX的任务调度


    上一篇笔记介绍了一些绕开排程器(或调度程序,scheduler)来进行时间管理的一些小方法。这一篇详细介绍RTX的任务调度原理。

    RTX主要有三种调度方式:

    • Pre-emptive: 抢断式
    • Round robin: 轮转式
    • Co-operative: 合作式

    在正式介绍这些方式之前。先看一下RTX的进程优先等级设置。


    1.RTX的优先度

    每个task在创建之初都会有一个优先级(os_tsk_create(task_name,priority);)。优先级是一个从0到255的整形数据,该数据越高的task。优先级越高。每个优先级都有一个先入先出的队列结构。

    详细说来:

    首先,RTX并不能处理高速中断(FIQ。ARM处理器中最高优先级的中断),相反地,当高速中断发生时。RTX内核可能会被打断。

    然后到普通中断,普通中断并非一个进程,所以不须要设定优先度,但普通中断一定会打断进程。

    然后就到优先度为2-255的进程,这些进程会依照先入先出的顺序执行。低优先度的进程不能打断高优先度的进程,但高优先度的进程会打断低优先度的进程。假设当前最高优先度是x。但全部优先度为x的进程都处于等待状态,那么排程器就会考虑下一优先度(x-1)的进程。但一旦任一x进程进入就绪状态。排程器会打断低优先度进程。

    优先度为1的进程时轮转进程,以下介绍到轮转排程时会记录它与优先度为2-255进程的差别。


    优先度为0的进程为空暇进程。

    当没有进程运行时,RTX会运行它,并提升其优先度到1.


    几个特殊进程的优先度:os_idle_demon(void) 的优先度永远为0, RTX实在没进程可跑才会执行这个进程。os_error (U32 err_code)的优先度永远为255。用于处理错误的。这两个进程原型都在RTX_CONFIG.C文件里。


    另外,除了创建时给进程分配优先级。优先级也是能够通过调用下面服务改变:

    os_tsk_prio(taskID,priority);用于改变其它进程的优先度。

    os_tsk_prio_self(priority); 用于改变当前进程的优先度。


    2.RTX的调度


    搞清楚RTX的优先级后,事实上RTX的调度不难理解。



    1. pre-emptive

    每个进程都有不同的优先级。最高优先级的进程会执行,排程器不会终止它。所以它会执行直到它自行中止挂起(blocked),或者被更高优先级的进程打断。

    自行挂起的办法事实上我们上一节介绍过,就三个:os_tsk_pass();, os_dly_wait(delay_time);os_itv_wait(void);.假设其被中止挂起。其余优先级最高的进程会执行。这个配置的办法就是除能在RTX_CONFIG.C中的Round-Robin Task Switching项。



    2. Round robin


    每个进程的优先级都是1。每个进程都会被分配到一个时间片,在执行完这个时间片后,该进程就会增加优先级为1的队列的末端,然后队列最前端的进程继续执行。

    时间片由RTX_CONFIG.C中的Round_Robin Timeout[ticks]决定。准确时间是Round_Robin Timeout[ticks]×Time tick value[us] (μs). 如上图所看到的。那么时间片就是10000×5=50000μs.配置该排程须要使能Round-Robin Task switching项。



    3. Co-operative


    这个是全部进程都是同样的优先度(比如1,)且除能了轮转式排程。

    在这样的合作模式下,进程不会被排程器挂起,仅仅能自己中止。


    3.小结


    事实上RTX的任务调度非常灵活,最经常使用的就是轮转和抢断式调度混用: 一部分进程的优先度是大于2的。其它进程的优先度是1(轮转式排程)。也就是说假设优先度大于2的进程就绪了,优先执行,假设没有就绪的大于2的进程,那么就先执行轮转式的进程。并且加上不同的进程间能够相互调节进程的优先度,所以调度的自由度非常大的。


    另一些具体的细节问题,比如优先度反转等问题,在记录到进程间通讯后。再具体记录一下吧。


  • 相关阅读:
    RTP 与RTCP 解释. 含同步时间戳
    Linux命令之ar
    函数参数的传递问题(指针的指针)
    传指针和传指针引用的区别/指针和引用的区别(本质)
    gdb optimized out错误解决
    实时视频应用之QoS关键技术分析
    中国大陆地区桌面操作系统占比
    一句命令查询 当前目录下面不同文件前缀的数量 并且进行排序
    一致性哈希算法和Go语言实现
    频率之外谁重要?计算机存储系统解析(转载)
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5221731.html
Copyright © 2011-2022 走看看