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次\r\n",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处。

 

posted @ 2020-05-01 00:09  薛定谔的小灯泡  阅读(417)  评论(0编辑  收藏  举报