记录一下和任务创建有关的函数以及这些函数的用法。以下函数在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//任务选项
我们在创建一个任务时,只需要调用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处。