打印
[应用相关]

关于系统的任务执行

[复制链接]
2247|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackbao|  楼主 | 2008-5-29 17:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ev, se, ST, os, CPU
如下面的任务:
static  void  AppTaskKbd (void *p_arg)
{
    CPU_BOOLEAN  b1_prev;
    CPU_BOOLEAN  b1;
    CPU_INT08U   key;


    (void)p_arg;

    b1_prev = DEF_FALSE;
    key     = 1;

    while (DEF_TRUE) {
        b1 = PB_GetStatus(1);

        if (b1 == DEF_TRUE && b1_prev == DEF_FALSE) {
            if (key == 2) {
                key = 1;
            } else {
                key++;
            }

            OSMboxPost(AppUserIFMbox, (void *)key);
        }

        b1_prev = b1;

        OSTimeDlyHMSM(0, 0, 0, 20);
    }
}
我想问一下,这个任务是怎么调度的,我按下按键的时候它得到一个值,再按下键时他是怎么执行的
  这个函数中的:
   OSTimeDlyHMSM(0, 0, 0, 20);
  运行完后
   此函数是一直在while (DEF_TRUE) {
                     }
运行 还是从函数开始。
    如果是在while里  那么
   if (b1 == DEF_TRUE && b1_prev == DEF_FALSE)语句
就不再执行了
  如果不是这样
    b1_prev = b1 有什么作用????
沙发
dld2| | 2008-5-29 17:48 | 只看该作者

在while里,不是从函数开始

“如果是在while里  那么
   if (b1 == DEF_TRUE && b1_prev == DEF_FALSE)语句
就不再执行了
  如果不是这样
    b1_prev = b1 有什么作用????


没看懂。似乎没有问题啊。

使用特权

评论回复
板凳
jackbao|  楼主 | 2008-5-29 19:17 | 只看该作者

我好像明白了

还有一个问题  任务之间是怎么调度的  比如说有三个任务 优先级为  5 6 7
那么是不是在5 的延时语句来执行 6 或7 
   但是6后 应该就去执行5了  什么时候能执行7呢

使用特权

评论回复
地板
dld2| | 2008-5-29 19:34 | 只看该作者

调度

抢占式调度:
任务有几个基本状态:阻塞、就绪、执行。
同时只有一个任务处于执行态,其他处于阻塞或就绪态。
何时发生调度:
    一个更高优先级任务进入就绪态。
    当前执行态任务访问系统调用,使自己进入阻塞状态。

使用特权

评论回复
5
jackbao|  楼主 | 2008-5-30 09:55 | 只看该作者

我只是想知道

想知道 程序是怎么寻找 任务的状态  
             还有任务进入就绪状态  怎么判断
                     当前执行态任务访问系统调用,使自己进入阻塞状态。??????我没见到任务 有这个动作呀 

使用特权

评论回复
6
dld2| | 2008-5-30 10:09 | 只看该作者

RE

楼主用的是ucos吧。去看邵贝贝那本书。

使用特权

评论回复
7
dld2| | 2008-5-30 12:15 | 只看该作者

呵呵

没有QQ

你的问题,看看书就明白了。所谓实时操作系统(RTOS)基本都是这样调度的。
要想用好OS,要学习一些OS原理。大学的教科书就可以。

使用特权

评论回复
8
jackbao|  楼主 | 2008-5-30 12:46 | 只看该作者

好的

谢谢

使用特权

评论回复
9
jackbao|  楼主 | 2008-5-30 14:28 | 只看该作者

INT8U  const  OSUnMapTbl[256] = {
    0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x00 to 0x0F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x10 to 0x1F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x20 to 0x2F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x30 to 0x3F                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x40 to 0x4F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x50 to 0x5F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x60 to 0x6F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x70 to 0x7F                             */
    7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x80 to 0x8F                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0x90 to 0x9F                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xA0 to 0xAF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xB0 to 0xBF                             */
    6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xC0 to 0xCF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xD0 to 0xDF                             */
    5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,       /* 0xE0 to 0xEF                             */
    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0        /* 0xF0 to 0xFF                             */
};
请问这个表 怎么使用
  有关代码
    #if OS_LOWEST_PRIO <= 63                         /* See if we support up to 64 tasks                   */
    INT8U   y;


    y             = OSUnMapTbl[OSRdyGrp];
    OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl][y]]);
     

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

260

帖子

0

粉丝