⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pending.txt

📁 UCOSII的一个测试程序,在PC机情况下实现一个挂起的操作与恢复.
💻 TXT
字号:
/*该程序完成的是一个简单的挂起与恢复的操作,其中有一个问题当YouTask中的if条件是x>20(和MyTask要样时)
当第一行运行到最后一个的时候会出现最后一个Y后跑到别的地方去的现象,原因是,当最后一个M出现后X的值
已经变成21(在于20)这样经过一秒钟YouTask运行时,判断出X>20,于是执行IF中语句,使得X=0,这样当两次执行
显示字符的函数时,要--x,导致x的值不确定,从而出现上述现象.解决方法是,让YouTask中的if判断条件是
x>21即第一个程序所示,或用第二个程序的方法,但从程序来看第一种方法明显更好! */


#include"includes.h"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
void MyTask(void *data);

void YouTask(void *pdata);

char *s_Y="Y";
 


//////////////// 
void main(void)
{


char * s_M="M";


OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
OSTaskCreate(
MyTask,
s_M,
&MyTaskStk[TASK_STK_SIZE-1],
0
);
OSStart();
}
//////////// 
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();

//COUSTOMIZED PRORRAM
OSTaskCreate(
YouTask,
s_Y,
&YouTaskStk[TASK_STK_SIZE-1],
1
);

//COUSTOMIZED PRORRAM
for(;;)
{
if(x>20)
{
x=0;
y+=2;
}
if(x==15) OSTaskResume(1);
PC_DispChar(
x,y,
*(char *)pdata,
DISP_BGND_BLUE+DISP_FGND_LIGHT_RED
);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}

/////////////////////////////////////////CREATE YOUTASK ........

void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
 --x;
for(;;)
{
if(x>21)
{ 
x=0;
y+=2;
 
}
 
PC_DispChar(
 --x,++y,
*(char *)pdata,
DISP_BGND_BLUE+DISP_FGND_LIGHT_RED
);

x++;
y--;
if(x==10)  OSTaskSuspend(OS_PRIO_SELF); 

 
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
 }
OSTimeDlyHMSM(0,0,1,0);
}
}
/*********************************************************************************************
#include"includes.h"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YouTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
void MyTask(void *data);

void YouTask(void *pdata);

char *s_Y="Y";
 


//////////////////////////////////////////////////////////////////////////////
void main(void)
{


char * s_M="M";


OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
OSTaskCreate(
MyTask,
s_M,
&MyTaskStk[TASK_STK_SIZE-1],
0
);
OSStart();
}
//////////////////////////////////////////////////////////////////////////
void MyTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();

//COUSTOMIZED PRORRAM
OSTaskCreate(
YouTask,
s_Y,
&YouTaskStk[TASK_STK_SIZE-1],
1
);

//COUSTOMIZED PRORRAM
for(;;)
{
if(x>20)
{
x=0;
y+=2;
}
if(x==15) OSTaskResume(1);
PC_DispChar(
x,y,
*(char *)pdata,
DISP_BGND_BLUE+DISP_FGND_LIGHT_RED
);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}
}

/////////////////////////////////////////CREATE YOUTASK ........

void YouTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL();
PC_VectSet(0x08,OSTickISR);
PC_SetTickRate(OS_TICKS_PER_SEC);
OS_EXIT_CRITICAL();
OSStatInit();
 --x;
for(;;)
{
if(x>20)
{ 


PC_DispChar(
 --x,++y,
*(char *)pdata,
DISP_BGND_BLUE+DISP_FGND_LIGHT_RED
);



x=0;
y+=2;
goto lable;
}
 
 



PC_DispChar(
 --x,++y,
*(char *)pdata,
DISP_BGND_BLUE+DISP_FGND_LIGHT_RED
);

x++;
y--;
if(x==10)  OSTaskSuspend(OS_PRIO_SELF); 

lable:
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
 }
OSTimeDlyHMSM(0,0,1,0);
}
}

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -