UCOS学习(四)——任务创建、删除、挂起、恢复


  • ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大二学生。
  • ⏩最近开始学习UCOS操作系统,后面会更新一些关于UCOS学习笔记。
  • ⏩今天学习了任务的创建、删除、挂起、恢复。
  • ⏩感谢你的阅读,不对的地方欢迎指正。

UCOSIII启动和初始化

UCOS启动和初始化步骤:

  1. OSInit() 初始化UCOSIII
  2. OS_CRITICAL_ENTER() 进入临界区
  3. OSTaskCreate() 创建任务
  4. OS_CRITICAL_EXIT() 退出临界区
  5. OSStart() 开启UCOSIII
int main(void)
{
    
    
	OS_ERR err;
	CPU_SR_ALLOC();
	
	delay_init();       //延时初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置
	uart_init(115200);    //串口波特率设置
	LED_Init();         //LED初始化
	
	OSInit(&err);		//初始化UCOSIII
	OS_CRITICAL_ENTER();//进入临界区
	//创建任务1、任务2、任务3.。。。
	OSTaskCreate();				
	
	OS_CRITICAL_EXIT();	//退出临界区	 
	OSStart(&err);  //开启UCOSIII
	while(1);
}

创建任务

创建一个任务,需要定义任务优先级、任务堆栈大小、任务控制块、任务堆栈和任务函数,然后调用OSTaskCreate();创建任务

//任务优先级
#define START_TASK_PRIO		3
//任务堆栈大小	
#define START_STK_SIZE 		512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

调用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,//任务堆栈深度限位(一般是任务堆栈大小/10)
                    CPU_STK_SIZE   stk_size, //任务堆栈大小
                    OS_MSG_QTY     q_size,   //内部任务消息队列
                    OS_TICK        time_quanta,//当使能时间片轮转时的时间片长度,为0时为默认长度
                    void          *p_ext,    //指向用户补充的存储区
                    OS_OPT         opt,      //任务特定选项
                    OS_ERR        *p_err)    //保存该函数调用的错误码

其中比较重要的,也是我们需要设置的参数有:

                    OS_TCB        *p_tcb,    //任务控制块
                    CPU_CHAR      *p_name,   //任务名
                    OS_TASK_PTR    p_task,   //任务函数
                    OS_PRIO        prio,     //任务优先级
                    CPU_STK       *p_stk_base,//任务堆栈数组基地址
                    CPU_STK_SIZE   stk_limit,//任务深度大小(一般是任务堆栈大小/10)
                    CPU_STK_SIZE   stk_size, //任务堆栈大小
                    OS_OPT         opt,      //任务特定选项
                    OS_ERR        *p_err)    //保存该函数调用的错误码

其他的参数如果不用可以设置为0.
错误码

    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)//保存调用该函数的错误码

注意:尽量不要在任务运行的时候删除任务。
错误码

    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    要恢复的任务尚未挂起

猜你喜欢

转载自blog.csdn.net/qq_52608074/article/details/122391574