zoukankan      html  css  js  c++  java
  • ucosIII_任务创建

    记录一下和任务创建有关的函数以及这些函数的用法。以下函数在os_task.c文件中。 

    1.任务创建

    1.1任务创建API使用

    创建任务使用 OSTaskCreate(),该函数原型如下:

    void  OSTaskCreate (OS_TCB        *p_tcb,  //任务控制块
                        CPU_CHAR      *p_name,  //任务名字
                        OS_TASK_PTR    p_task,  //任务函数
                        void          *p_arg,  //传递给任务函数的参数
                        OS_PRIO        prio,   //任务优先级
                        CPU_STK       *p_stk_base,//任务堆栈基地址
                        CPU_STK_SIZE   stk_limit,//任务堆栈深度限位
                        CPU_STK_SIZE   stk_size,  //任务堆栈大小
                        OS_MSG_QTY     q_size,    //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                        OS_TICK        time_quanta,//当使能时间片轮转时的时间片长度,为0时为默认长度,
                        void          *p_ext,    //用户补充的存储区
                        OS_OPT         opt,      //任务选项
                        OS_ERR        *p_err)      //存放该函数错误时的返回值

    {//函数体}

    关于该函数的参数任务控制块和任务堆栈的注释

    任务控制块OS_TCB:用来保存任务的所有的信息,它是个结构体
    任务堆栈CPU_STK:用来在切换任务和调用其它函数的时候保存现场,CPU_STK实际上是unsigned  int类型

    OS_OPT  opt//任务选项   
     opt            contains additional information (or options) about the behavior of the task.
    *                             See OS_OPT_TASK_xxx in OS.H.  Current choices are:
    *
    *                                 OS_OPT_TASK_NONE            No option selected
    *                                 OS_OPT_TASK_STK_CHK         Stack checking to be allowed for the task
    *                                 OS_OPT_TASK_STK_CLR         Clear the stack when the task is created
    *                                 OS_OPT_TASK_SAVE_FP         If the CPU has floating-point registers, save them
    *                                                             during a context switch.
    *                                 OS_OPT_TASK_NO_TLS          If the caller doesn't want or need TLS (Thread Local 
    *                                                             Storage) support for the task.  If you do not include this
    *                                                             option, TLS will be supported by default.
     

    我们在创建一个任务时,只需要调用OSTaskCreate这个函数,并把它的参数补全即可。

    定义OSTaskCreate的参数

    //任务优先级
    #define MyTaskPrio        3
    //任务堆栈大小    
    #define TaskSize         128
    //任务控制块
    OS_TCB TaskTCB;
    //任务堆栈    
    CPU_STK TASK_STK[TaskSize];
    //任务函数
    void MyTask(void *p_arg);

    调用OSTaskCreate创建任务时传递我们定义的参数

    OSTaskCreate((OS_TCB     * )&TaskTCB,        
                     (CPU_CHAR    * )"Task1",         
                     (OS_TASK_PTR )MyTask,             
                     (void        * )0,                    
                     (OS_PRIO      )MyTaskPrio,     
                     (CPU_STK   * )&Task_STK[0],    
                     (CPU_STK_SIZE)Task_SKT/10,    
                     (CPU_STK_SIZE)Task_SKT,        
                     (OS_MSG_QTY  )0,                    
                     (OS_TICK      )0,                    
                     (void       * )0,                    
                     (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
                     (OS_ERR     * )&err);        

    现在已经创建了一个任务,这个任务仅仅是高速UCOS当前有这么一个名字叫Task1的任务,此时这个任务还没有启动,那我们创建这个任务想要干什么呢?比如我们香让这个任务通过串口发送数据,那串口发送这个功能在哪里写?看第3个参数是一个函数指针,我们传递的是MyTask。这个参数其实是我们定义的一个函数

     我们接下来就是要实现这个函数,把串口发送数据的功能写在这个函数里

    void MyTask(void *p_arg)
    {
        u8 task1_num=0;
        OS_ERR err;
        CPU_SR_ALLOC();
        p_arg = p_arg;

    OS_CRITICAL_EXIT(); while(1) {
         task1_num++;
            printf("第一个任务Mystak正在运行 :%d次
    ",task1_num);
            OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s    
        }
    }

     1.2任务创建的两种方法

    第一种是在main中把所有的任务创建好在开启任务调度

    第二种是先在main中创建一个任务,开启任务调度,在之前创建的第一个任务中创建其他任务

    第二种比较常用。

    第二种方式的流程

    //主函数
    main()
    {
      //创建第一个任务,用于创建其他任务

      OSTaskCreate(CreateOtherTask);
      //开启任务调度
      OSSTART();
    }

    //第一个任务
    CreateOtherTask()
    {
      OSTaskCreate(Task1)//创建任务1
      OSTaskCreate(Task2)//创建任务2
      OSTaskCreate(Task3)//创建任务3
      ...          //创建任务n  
      OSTaskDelete(
    CreateOtherTask)//删除第一个任务。(所有任务创建好了,用来创建任务的这个任务就没用了,直接删了)
    }
    //任务1的具体逻辑
    Task1()
    {
      while(1){}
    }
    //任务2的具体逻辑
    Task2()
    {
      while(1){}
    }
    //任务3的具体逻辑
    Task3()
    {
      while(1){}
    }

    2.任务删除 /挂起/恢复

    2.1 任务删除

    任务删除自身

    任务A删除任务B

    void  OSTaskDel (OS_TCB  *p_tcb,
                     OS_ERR  *p_err)

    描述:第一个参数传被删除任务的tcb。传空则删除自己,使用方法

        OSTaskDel((OS_TCB*)0,&err); //删除任务自身

    被删除的任务代表该任务不再被UCOS管理,代码本身还在存储器中,该任务变成了休眠状态。如果想要再次管理该任务,再创建即可。

    2.2任务挂起

    任务挂起本身

    任务A挂起任务B

    void   OSTaskSuspend (OS_TCB  *p_tcb,
                          OS_ERR  *p_err)

    描述:第一个参数传被挂起的任务的tcb。传空则挂起自己(哪个任务调用这个函数,哪个任务挂起),使用方法   

        OSTaskSuspend ((OS_TCB*)0,&err);

    2.3任务恢复

     
    void  OSTaskResume (OS_TCB  *p_tcb,
                        OS_ERR  *p_err)

    描述:第一个参数传被恢复的任务的tcb。不能为空。被挂起的任务不能恢复自己,使用方法

        OSTaskResume((OS_TCB*)&TaskTCB,&err);

    暂时做个简单的记录,方便以后查找。关于具体的使用方法,在os_task.c文件中,函数前面的Description处。

  • 相关阅读:
    【交互稿】规范
    【管理】带人
    【产品文档】一份很不错的产品文档-神策
    没有Iphone也能装逼:让Android版QQ显示成Iphone6
    帝国备份王(Empirebak)万能cookie及拿shell
    mysql syntax bypass some WAF
    主流的国外机房地址
    最新php一句话木马
    手机自带的显示基站命令(android手机定位,iphone基站定位)
    User Agent跨站攻击
  • 原文地址:https://www.cnblogs.com/1024E/p/13416951.html
Copyright © 2011-2022 走看看