查看: 2098|回复: 0

【连载】嵌入式OS入门笔记-以RTX为案例(六):RTX的任务调度

[复制链接]
  • TA的每日心情
    慵懒
    2014-8-14 15:38
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-8-16 01:42:30 | 显示全部楼层 |阅读模式
    分享到:
    上一篇笔记介绍了一些绕开排程器(或调度程序,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的进程,那么就先执行轮转式的进程。而且加上不同的进程间可以相互调节进程的优先度,所以调度的自由度很大的。

        还有一些具体的细节问题,例如优先度反转等问题,在记录到进程间通讯后,再详细记录一下吧。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-19 03:50 , Processed in 0.118799 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.