📄 pending.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 + -