本例用了BC4.5软件,在DOS环境模拟uc/os-ii
/*本例应用程序的任务使用了延时函数OSTimeDly()进行延时。在任务MYTASK中还调用了
OSTimeDlyResume(prio)取消了任务YOUTASK的延时。为了观察任务YOUTASK的延时时间的变化*/
#include "INCLUDES.h"
#define TASK_STK_SIZE 512 /* 任务堆栈长度*/
INT8U x=0,y=0;
OS_EVENT *Fun_Semp; /* 声明信号量*/
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
void MyTask(void *data); /* 声明任务 */
void YouTask(void *data);
//extern OSTimeTickHook (void);
/*
*************************************************************************
* MAIN主函数
***************************************************************************
*/
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, &MyTaskStk[TASK_STK_SIZE - 1], 0); //创建任务函数
OSStart(); /* 启动多任务管理 */
}
void MyTask(void *pdata)
{
char *s_Y="Y";
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key; /*用于退出的建*/
pdata = pdata; /* 避免编译报错*/
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* 安装时钟中断向量 */
PC_SetTickRate(OS_TICKS_PER_SEC); /* 设置时钟频率 */
OS_EXIT_CRITICAL();
OSStatInit(); /* 初始化统计任务 */
OSTaskCreate(YouTask,s_Y, &YouTaskStk[TASK_STK_SIZE - 1], 2); /*创建任务函数,实参是Y*/
for (;;)
{
if(x>20)
{
x=0;
y+=2;
}
if(y>1) OSTimeDlyResume(2); /*取消YOUTASK任务的延时*/
  C_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE); /*显示字符M */
x+=1;
/*如果恩下ESC键,则退出UC/OS-II*/
if (PC_GetKey(&key) == TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn(); /* Return to DOS */
}
}
OSTimeDly(100); /* 等待100个节拍*/
}
}
void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 //Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
for (;;)
{
if(x>20)
{
x=0;
y+=2;
}
  C_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
OSTimeDly(500); //等待500个时钟节拍
}
}
/*
程序分析:1,MyTask任务的内容是:a),创建YouTask任务;b),每执行一次MyTask任务(显示一个字符M)就将自己挂起500个时钟节拍的时长CPU转去执行YouTask;当x>20时执行“OSTimeDlyResume(2); ”语句;即结束YouTask任务的延时进入就绪态;
2,YouTask任务的内容:每执行一次YouTask任务(显示一个字符Y)就将自己挂起500个时钟节拍的时长CPU转去执行MyTask;
3,实验现象:显示屏显示:MY M M M M MY M M M M MY M M M M MY M M M M MY MY MY MY MY
*/
|