设计一个有2个任务的应用程序Mytask,运行后工作是:每秒在显示器上显示一串字符"M",在任务MyTask中再建立一个任务YouTask,要求YouTask任务运行5次后,挂起任务MyTask;然运行10次后,恢复任务MyTask
#include "INCLUDES.h"
#define TASK_STK_SIZE 512 /* 任务堆栈长度*/
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT8U x=0,y=0; //字符显示位置
void MyTask(void *data); /* 声明任务 */
void YouTask(void *data);
void main (void)
{
char *s_m="M";
OSInit(); /* 初始化uC/OS-II */
PC_DOSSaveReturn(); /* 保存DOS环境 */
PC_VectSet(uCOS, OSCtxSw);/* 安装uC/OS-II的中断 */
OSTaskCreate(MyTask,
s_m, //任务MyTask执行时传递给MyTask
&MyTaskStk[TASK_STK_SIZE - 1],
0);
OSStart(); /* 启动多任务管理 */
}
//set up task
void MyTask(void *pdata)
{
char *S="Y"; //定义要显示的字符
#if OS_CRITICAL_METHOD == 3/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key; /*用于退出的建*/
pdata = pdata; /* Prevent compiler warning*/
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* 安装时钟中断向量 */
PC_SetTickRate(OS_TICKS_PER_SEC); /* 设置时钟频率 */
OS_EXIT_CRITICAL();
OSStatInit(); /* 初始化统计任务 */
OSTaskCreate(YouTask, //创建的任务名
S, //任务YouTask执行时S传递给使用YouTask作为参数(邵P117,ENP108)
&YouTaskStk[TASK_STK_SIZE - 1],
2);
for (;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
//如果恩下ESC键,则退出UC/OS-II
if (PC_GetKey(&key) == TRUE)
{ /* See if key has been pressed */
if (key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0, 0, 3, 0);
}
}
void YouTask(void *pdata)
{
INT8U time=0;
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
if(time==5)
{
OSTaskSuspend(0); //挂起任务MYTASK
}
if(time==10)
{
OSTaskResume(0); //恢复任务Mytask
}
time+=1;
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char*)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
执行结果见相册
阅读(2266) | 评论(0) | 转发(0) |