ucosIII 任务创建与删除,任务挂起与恢复,时间片轮转调度

Ucos III任务管理详解:创建、删除、挂起、恢复及时间片调度
本文详细介绍了Ucos III中任务管理的关键概念,包括任务的创建与删除、任务的挂起与恢复,以及时间片调度的实现。着重解释了任务创建的过程、挂起与恢复的机制,以及时间片调度的基本原理与配置方法。

本文导读:
一共分为三部分:
第一部分:任务创建与删除。重点在于理解任务创建的各个参数即可。
第二部分:任务挂起和恢复。函数比较简单,看看即可。
第三部分:时间片调度
重点在于第三部分代码讲解

任务创建与删除

创建

  • 步骤1:先调用OSTaskCreate创建任务 步骤2:使用OSStart(&err)开启任务
  • 切记:在没有使用时间片轮转的时候,任何任务的优先级不能相同
  • 任务创建思路,在main中只创建一个start任务,然后在其中创建其他任务
//任务优先级
#define TASK2_TASK_PRIO     4
//任务堆栈大小    
#define TASK2_STK_SIZE      128
//任务控制块
OS_TCB Task2_TaskTCB;
//任务堆栈
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
//任务函数
void task2_task(void *p_arg);

CPU_SR_ALLOC();
...
OS_CRITICAL_ENTER();    //进入临界区
//任务创建
    OSTaskCreate((OS_TCB    * )&StartTaskTCB,       //任务控制块
                 (CPU_CHAR  * )"start task",        //任务名称
                 (OS_TASK_PTR )start_task,          //任务函数
                 (void      * )0,                   //任务函数的参数,一般不用,这里直接设置为0
                 (OS_PRIO     )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],  //任务堆栈基址
                 (CPU_STK_SIZE)START_STK_SIZE/10,   //任务堆栈的栈深
                 (CPU_STK_SIZE)START_STK_SIZE,      //任务堆栈大小
                 (OS_MSG_QTY  )0,                   //内建消息队列长度
                 (OS_TICK     )0,                   //时间片长度(单位时钟节拍)。0:表示为默认值。为OS_CFG_TICK_RATE 200u/10.为20个节拍,也就是100ms
                 (void      * )0,                   //用户补充的存储区,用于扩展PCB,一般不用。
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //选择检查和清除STK功能(SAVE_FP浮点处理的,不用管,移植的时候已经处理)
                 (OS_ERR    * )&err);               //错误信息

OS_CRITICAL_EXIT(); //退出临界区
  • 记得在创建任务的时候要进入临界区。并且进入临界区之前,要调用CPU_SR_ALLOC();
  • OSTimeDlyHMSM(1h, 1m, 1s, 1ms)//括号内为参数的实际含义

删除

void  OSTaskDel (OS_TCB  *p_tcb, //需要删除的PCB
                 OS_ERR  *p_err) //错误信息
  • 一般不在系统运行时删除:比如a,b使用信号量,删除了a之后,会影响到b任务

任务挂起与恢复

挂起

当需要暂停但是不需要删除任务的时候,需要执行挂起

void   OSTaskSuspend (OS_TCB  *p_tcb, 
                      OS_ERR  *p_err)
  • 可能的err值
OS_ERR_SCHED_LOCKED   //you can't suspend the current task is the scheduler is locked
//(ISR中断服务函数)
OS_ERR_TASK_SUSPEND_ISR   //if you called this function from an ISR
OS_ERR_TASK_SUSPEND_IDLE  //if you attempted to suspend the idle task which is not allowed.
OS_ERR_TASK_SUSPEND_INT_HANDLER  //if you attempted to suspend the idle task which is not

恢复

void  OSTaskResume (OS_TCB  *p_tcb,
                    OS_ERR  *p_err)
  • 挂起和恢复比较简单。随便写写代码即可。

时间片轮转

时间片调度是ucosIII才有的,ucosII是没有的。

时间片调度初步

时间片调度是通过OS_SchedRoundRobin()进行的。
该函数由OSTimeTick或者OS_IntQTask()调用的

配置

步骤一:OS_CFG_SCHED_ROUND_ROBIN_EN 宏置为一
步骤二:调用OSSchedRoundRobinCfg 进行配置

void OSSchedRoundRobinCfg  (CPU_BOOLEAN            en,
                   //两个之间多少时钟节拍,0:为默认的OS_CFG_TICK_RATE/10
                            OS_TICK                dflt_time_quanta,
                            OS_ERR                *p_err);

放弃时间片

void  OSSchedRoundRobinYield (OS_ERR  *p_err)
实验报告三:(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 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值