因为嵌入式系统的课程学习,理解如何调用任务。
首先定义一个结构体。
//定义结构体
struct s{
char letter;
int time;
} s1 = {'M',3}, *ptr1 = &s1, s2 = {'Y',1}, *ptr2 = &s2; //s[2]是地址
这里s是结构体类型,s1和s2是结构体类型的变量名,即该结构体成员。然后对该结构体成员赋值,并定义了两个指针指向变量 s1和s2
的地址。注意这里的letter是字符类型类型不是字符串类型,所以用单引号'M',而不是用双引号"M"。
char类型是字符串的,一般是数组或者指针。
char * s_M="M";
然后根据MyTask函数的输入,由于void *pdata是定义的一个空类型的指针,函数不知道其类型,需要将pdata强制转换成输入结构体类型的sdata,然后将对应结构体的参数输入即可。
void MyTask(void *pdata)
{
struct s *sdata = (struct s *)pdata; // 将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();
for(;;)
{
if(x>50)
{
x=0;
y+=2;
}
PC_DispChar(x,y,
sdata->letter,
DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;
if(PC_GetKey(&key)==TRUE)
{
if (key == 0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,sdata->time,0);
}
}
这里用sdata->time或者(*sdata).time来表示对应的结构体成员内的参数。
最后是主函数,注意这里创建了两个任务,虽然都是MyTask,但输入不同,优先级也不同,所以需要两个不同的堆栈存储临时数据。
void main(void)
{
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
OSTaskCreate(
MyTask,
ptr1,
&MyTaskStk[TASK_STK_SIZE - 1],
0
);
OSTaskCreate(
MyTask,
ptr2,
&YouTaskStk[TASK_STK_SIZE - 1],
2
);
OSStart();
}
效果图展示。