scxueyin_521 发表于 2010-1-11 23:21:32

ZLG-LPC2200开发板第一个OS试验的详细注解

最近开始学UC/OS了,ZLG的开发板试验做到OS这块一直没什么进展,主要是对UC/OS了解不深,特别是任务切换部分,还是多看书 多想 再看书才有进展啊,
以下算是对任务切换皮毛注解,希望对刚接触到的朋友有点帮助。总在这里获取知识,算是点点回报吧。高手勿笑俺啊...

/****************************************Copyright (c)**************************************************
********************************************************************************************************/

#include "config.h"

#defineTASK_STK_SIZE                  64
OS_STK      TaskStartStk;
OS_STK      TaskStk;

#define          KEY1        (1 << 14)             /* P0.14为key1 */
#define          BEE        (1 << 7)            /* P0.07为蜂鸣器 */


voidTaskStart(void *data);
voidTask(void *data);
/*********************************************************************************************************
********************************************************************************************************/
int main (void)
{
    OSInit();
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk, 0);
    OSStart();
    return 0;
}

/*********************************************************************************************************
********************************************************************************************************/

voidTaskStart(void *pdata)
{
    pdata = pdata;                                                /* 避免编译警告 */

    TargetInit();                                                   /* 目标板初始化 */
    IODIR &= ~KEY1;                                                              /* 设置KEY1为输入*/
    IOSET = BEE;
    IODIR |= BEE;                                                              /* 设置蜂鸣器为输出*/
    PINSEL0 = (PINSEL0 & 0xcffff3ff);                               /* 管脚选择模块初始化 */
   
    OSTaskCreate(Task, (void *)0, &TaskStk, 10); /* 创建任务   */

    for (;;)
    {
      OSTaskSuspend(OS_PRIO_SELF);//挂起自己,此时任务级最高的就绪任务将运行。0若被唤醒,则继续执行下面语句。
      IOCLR = BEE;
      OSTimeDly(OS_TICKS_PER_SEC / 8);
      IOSET = BEE;
      OSTimeDly(OS_TICKS_PER_SEC / 4);

      IOCLR = BEE;
      OSTimeDly(OS_TICKS_PER_SEC / 8);
      IOSET = BEE;
      OSTimeDly(OS_TICKS_PER_SEC / 4);
    }
}

/*********************************************************************************************************
    平时很少用到的continue语句出现了,C语言中,continue语句一般形式为"continue;"
  其作用为结束本次循环。即跳出循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
  continue语句和break语句的区别是:
  continue语句只结束本次循环,而不终止整个循环的执行。而break语句则是结束整个循环过程,
            不再判断执行循环的条件是否成立。
  continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。
  continue语句只用在for、while、do-while等循环体中, 常与if条件语句一起使用, 用来加速循环。
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
voidTask(void *pdata)
{
    pdata = pdata;                                    /* 避免编译警告 */

    for (;;)
    {
      OSTimeDly(OS_TICKS_PER_SEC / 50);               /* 延时20毫秒 */
      if ((IOPIN & KEY1) != 0)
      {
            continue;
      }
      OSTimeDly(OS_TICKS_PER_SEC / 50);               /* 延时20毫秒 */
      if ((IOPIN & KEY1) != 0)
      {
            continue;
      }
      OSTaskResume(0);
      //此时表示2次防抖确认是低电平,即确定按键按下,唤醒0级任务,去处理完0级任务后
      //0级任务在for(;;)循环中又挂起,10又得到优先权,返回到此处执行下列while语句....
      while ((IOPIN & KEY1) == 0)
      //唤醒0后,处理完了0中任务,0又被挂,10得到了优先权,从断点(即唤醒语句后)处继续执行
      //这个while语句是为了等待按键弹起...
      {
            OSTimeDly(OS_TICKS_PER_SEC / 50);         /* 延时20毫秒 */
      }
    }
}
/*********************************************************************************************************
********************************************************************************************************/

ndust 发表于 2010-1-11 23:47:03

jh
页: [1]
查看完整版本: ZLG-LPC2200开发板第一个OS试验的详细注解