今天学习了UCOSIII下任务的创建、删除、挂起、恢复,其实都是几个简单的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, //内建消息队列的长度
OS_TICK time_quanta, //时间片的长度(单位时钟节拍数)
void *p_ext, //指针(指向用户的存储区)
OS_OPT opt, //选项(可以有多个)
OS_ERR *p_err) //错误码
任务创建的流程:
1、设置任务优先级、任务堆栈大小,定义任务堆栈、任务控制块,声明任务函数。
2、main函数中,最先定义一个错误码,然后CPU_SR_ALLOC(); 宏定义CPU_SR,然后是时钟设定,中断分组,底层驱动初始化,接着初始化OS,进入临界区,然后创建开始任务,完成后退出临界区,开启OS,进入死循环。
3、编写开始任务,初始化及一些条件编译完成后,进入临界区在开始任务中创建别的任务,最后要挂起开始任务,然后退出临界区。
4、编写其他任务的任务函数,初始化要在临界区中完成。
错误码:
OS_ERR_NONE 创建成功
OS_ERR_ILLEGAL_CREATE_RUN_TIME 试图创建一个任务在调用OSSafetyCriticalStart()后
OS_ERR_NAME p_name是一个空指针
OS_ERR_PRIO_INVALID 优先级有问题,注意五个不能使用的优先级
OS_ERR_STK_INVALID p_stk_base是一个空指针
OS_ERR_STK_SIZE_INVALID 堆栈深度限位为零
OS_ERR_TASK_CREATE_ISR 在中断中调用该函数
OS_ERR_TASK_INVALID p_task是一个空指针
OS_ERR_TCB_INVALID p_tcb是一个空指针
任务的删除
OSTaskDel()函数,有俩个参数,函数的原型如下:
void OSTaskDel (OS_TCB *p_tcb, //任务控制块
OS_ERR *p_err) //错误码
删除某个任务后,它占用的TCB和堆栈可以再次利用来创建其他任务
要尽量避免在系统运行中删除任务
错误码:
OS_ERR_NONE 删除成功
OS_ERR_STATE_INVALID 任务的状态无效
OS_ERR_TASK_DEL_IDLE 试图删除空闲任务
OS_ERR_TASK_DEL_INVALID 试图删除中断服务任务
OS_ERR_TASK_DEL_ISR 在中断中调用该函数
任务的挂起
OSTaskSuspend()函数,有俩个参数,函数的原型如下:
void OSTaskSuspend (OS_TCB *p_tcb, //任务控制块
OS_ERR *p_err) //错误码
用于想暂停某个函数,但又不想把它删掉时将它挂起进入等待态。
错误码:
OS_ERR_NONE 该任务已经挂起(成功)
OS_ERR_SCHED_LOCKED 任务被锁定
OS_ERR_TASK_SUSPEND_ISR 在中断中调用该函数
OS_ERR_TASK_SUSPEND_IDLE 挂起空闲任务
OS_ERR_TASK_SUSPEND_INT_HANDLER 挂起中断服务函数
任务的恢复
OSTaskResume()函数,有俩个参数,函数的原型如下:
void OSTaskResume (OS_TCB *p_tcb, //任务控制块
OS_ERR *p_err) //错误码
恢复某个被挂起的任务
错误码:
OS_ERR_NONE 该任务已被恢复(成功)
OS_ERR_STATE_INVALID 任务处于无效状态
OS_ERR_TASK_RESUME_ISR 在中断中调用
OS_ERR_TASK_RESUME_SELF 恢复自己
OS_ERR_TASK_NOT_SUSPENDED 要恢复的任务尚未挂起