搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

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

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

#include "config.h"

#define  TASK_STK_SIZE                  64
OS_STK        TaskStartStk[TASK_STK_SIZE];
OS_STK        TaskStk[TASK_STK_SIZE];

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


void  TaskStart(void *data);
void  Task(void *data);
/*********************************************************************************************************
********************************************************************************************************/
int main (void)
{
    OSInit();
    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();
    return 0;
}

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

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

    TargetInit();                                                   /* 目标板初始化 */
    IODIR &= ~KEY1;                                                                /* 设置KEY1为输入*/
    IOSET = BEE;
    IODIR |= BEE;                                                                /* 设置蜂鸣器为输出*/
    PINSEL0 = (PINSEL0 & 0xcffff3ff);                               /* 管脚选择模块初始化 */
   
    OSTaskCreate(Task, (void *)0, &TaskStk[TASK_STK_SIZE - 1], 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条件语句一起使用, 用来加速循环。
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  Task(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毫秒 */
        }
    }
}
/*********************************************************************************************************
********************************************************************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-1-11 23:47:03 | 显示全部楼层
jh
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 23:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表