|
最近开始学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周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|