用指针结构体实现一个指针输入多个参数

        因为嵌入式系统的课程学习,理解如何调用任务。
   

        首先定义一个结构体。

    //定义结构体
    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();
}

        效果图展示。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值