UCOS学习笔记(三)任务的创建、删除、挂起、恢复

本文详细介绍了UCOSIII实时操作系统中任务的创建、删除、挂起与恢复的方法及注意事项。通过具体步骤与实例,帮助读者理解每个操作背后的机制与可能遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天学习了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    要恢复的任务尚未挂起

 

实验报告:(1)设计 Task0、Task1 两个任务任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0; 注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 (2)设计 MyTask、YouTask、KeyTask 任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务的状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。 (3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。当从键盘输入-号时动态的删除创建的一个任务,最多可删除 10 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值