打印
[ZLG-ARM]

uc/os-ii的任务调度

[复制链接]
1801|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
carrick|  楼主 | 2008-11-20 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "config.h"
#include "stdlib.h"

#define      KEY1    (1 << 20)           /* P0.20为KEY1 */
#define      BEEP    (1 << 7)            /* P0.07为蜂鸣器 */

#define    TaskStkLengh    64            //Define the Task0 stack length 定义用户任务0的堆栈长度 
OS_STK    TaskStk0[TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈
OS_STK    TaskStk1[TaskStkLengh];        //Define the Task1 stack 定义用户任务1的堆栈

void     Task0(void *pdata);            //Task0 任务0
void     Task1(void *pdata);            //Task0 任务1

int main(void)
{
    OSInit ();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 2);        
    OSStart ();
    return 0;                                                            
}

/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/
void Task0(void *pdata)
{   pdata = pdata;

    TargetInit ();
    PINSEL0 = PINSEL0 & 0xffff3fff;                                 // 管教选择模块初始化
    PINSEL1 = PINSEL1 & 0xfffffcff;
    IO0DIR &= ~KEY1;                                                // 设置KEY1的控制I/O为输入
    IO0DIR |= BEEP;                                                    // 设置蜂鸣器为输出
    IO0SET = BEEP;    
    
    OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 5);
    
    for (;;)
    {   OSTaskSuspend(OS_PRIO_SELF);
        IO0CLR = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 8);
        IO0SET = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 4);

        IO0CLR = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 8);
        IO0SET = BEEP;
        OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}

/*********************************************************************************************************
**                            Task1 任务1
********************************************************************************************************/
void  Task1(void *pdata)
{   pdata = pdata;                                      /* 避免编译警告 */

    for (;;)
    {   OSTimeDly(OS_TICKS_PER_SEC / 50);               /* 延时20毫秒 */
        if ((IO0PIN & KEY1) != 0)
        {   continue;
        }
        OSTimeDly(OS_TICKS_PER_SEC / 50);               /* 延时20毫秒 */
        if ((IO0PIN & KEY1) != 0)
        {   continue;
        }
        OSTaskResume(2);
        while ((IO0PIN & KEY1) == 0)
        {   OSTimeDly(OS_TICKS_PER_SEC / 50);           /* 延时20毫秒 */
        }
    }
}
   

相关帖子

沙发
carrick|  楼主 | 2008-11-20 20:02 | 只看该作者

问题

上面的就是一个蜂鸣和按键检测的程序,是周立功书上的程序
TASK0是蜂鸣控制,TASK1是按键检测。
我哦想请问的是UC/OS-II如何在这两个任务间切换的,也就是如何调度?
TASK0中OSTaskSuspend(OS_PRIO_SELF)将自身挂起,调到TASK1,延时20ms,接着if ((IO0PIN & KEY1) != 0)检测是不是有按键动作,没的话又来一20ms延时,又检测,又没的话就 OSTaskResume(2),恢复TASK0,接着执行TASK0,那不是没按键动作蜂鸣器也响了???

搞不清楚,麻烦各位解释下!
谢谢!

使用特权

评论回复
板凳
ZLG_Dengz| | 2008-11-21 00:21 | 只看该作者

RE

   你好,我这没有电路图,通过分析程序,按键按下时对应I/O口应该为低电平,松开为高电平。
   for (;;)
    {   OSTimeDly(OS_TICKS_PER_SEC / 50);
        if ((IO0PIN & KEY1) != 0)
        {   continue;
        //如果没有按键按下,此判断为真,执行continue;跳出本次循环
        //继续检测按键。而不会向下执行,故而不会唤醒task0.
        }
        
        OSTimeDly(OS_TICKS_PER_SEC / 50);
        //延时后重新判断按键状态,以消除抖动带来的误操作。
        if ((IO0PIN & KEY1) != 0)
        {   continue;
        //如果按键未按下,则识别为按键抖动,而跳出本次循环,
        //回到FOR循环起始位置,重新开始检测。
        //而不会执行下面的代码。而不会唤醒task0.
        }
        
        OSTaskResume(2);
        //等待按键松开,以避免同一次按下按键被多次识别。
        while ((IO0PIN & KEY1) == 0)
        {   OSTimeDly(OS_TICKS_PER_SEC / 50);   
        }
    }

使用特权

评论回复
地板
carrick|  楼主 | 2008-11-21 13:38 | 只看该作者

RE

谢谢上面的解释
当有按键按下时,才会执行OSTaskResume(2);之后就应该是任务切换到TASK0中的IO0CLR = BEEP;即蜂鸣器响了。下一步是OSTimeDly(OS_TICKS_PER_SEC/8);延时又应该切换到TASK1了,也就是说OSTaskResume(2);后的    
while ((IO0PIN & KEY1) == 0)
        {   OSTimeDly(OS_TICKS_PER_SEC / 50);   
        }
    }
不会被执行了。
还是弄不清OSTaskResume(2);的下一步程序是怎么执行的?
麻烦解释!谢谢!

使用特权

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

本版积分规则

17

主题

55

帖子

0

粉丝