zoukankan      html  css  js  c++  java
  • 任务管理之就绪表与就绪租

                                                     任务就绪表

    每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。

    在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。

    n假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:

      OSRdyGrp      |=0x02;

      OSRdyTbl[1]   |=0x10;

    n而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:

      OSRdyGrp      |=0x04;

      OSRdyTbl[2]   |=0x20;

    n从上面的计算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2^n 相或。uC/OS中,把2^n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:

      OSMapTbl[0] = 2^0 = 0x01(0000 0001)

      OSMapTbl[1] = 2^1 = 0x02(0000 0010)

       ……

      OSMapTbl[7] = 2^7 = 0x80(1000 0000)

    n如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:

    OSRdyGrp          |= OSMapTbl[prio>>3];

    OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07];

    n假设优先级为12——1100b

    OSRdyGrp      |=0x02;

    OSRdyTbl[1]   |=0x10;

    n将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。

    if((OSRdyTbl[prio>>3] &=

       ~OSMapTbl[prio&0x07]) == 0)

       OSRdyGrp &= ~OSMapTbl[prio>>3];

                                    根据就绪表确定最高优先级

    两个关键:

    将优先级数分解为高三位和低三位分别确定;

    高优先级有着小的优先级号;

  • 相关阅读:
    C# lock
    read appSettings in configuration file by XElement with xmlns
    get all sites under IIS
    Cross-site scripting(XSS)
    Do not throw System.Exception, System.SystemException, System.NullReferenceException, or System.IndexOutOfRangeException intentionally from your own source code
    C++ 算法
    C++ 数据结构概念
    C++ STL 常用算术和生成算法
    C++ STL 常用拷贝和替换算法
    C++ STL 常用排序算法
  • 原文地址:https://www.cnblogs.com/wgang171412/p/5080660.html
Copyright © 2011-2022 走看看