打印
[应用相关]

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

[复制链接]
1062|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mintspring|  楼主 | 2016-11-28 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一共分为三部分:
第一部分:任务创建与删除。重点在于理解任务创建的各个参数即可。
第二部分:任务挂起和恢复。函数比较简单,看看即可。
第三部分:时间片调度
重点在于第三部分代码讲解
任务创建与删除
创建
  • 步骤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)//括号内为参数的实际含义


沙发
mintspring|  楼主 | 2016-11-28 19:02 | 只看该作者
删除


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


使用特权

评论回复
板凳
mintspring|  楼主 | 2016-11-28 19:03 | 只看该作者
任务挂起与恢复
挂起
当需要暂停但是不需要删除任务的时候,需要执行挂起
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


使用特权

评论回复
地板
mintspring|  楼主 | 2016-11-28 19:04 | 只看该作者
恢复


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

使用特权

评论回复
5
mintspring|  楼主 | 2016-11-28 19:05 | 只看该作者
时间片轮转

时间片调度是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);




使用特权

评论回复
6
mintspring|  楼主 | 2016-11-28 19:06 | 只看该作者
放弃时间片
void  OSSchedRoundRobinYield (OS_ERR  *p_err)

使用特权

评论回复
7
Garen2| | 2016-11-29 14:41 | 只看该作者
时间片调度是ucosIII才有的,ucosII是没有的

使用特权

评论回复
8
mintspring|  楼主 | 2016-11-29 14:44 | 只看该作者
Garen2 发表于 2016-11-29 14:41
时间片调度是ucosIII才有的,ucosII是没有的

对的,最新版的才有这个。

使用特权

评论回复
9
Soraka| | 2016-11-30 21:48 | 只看该作者
好资料,顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

296

主题

4896

帖子

24

粉丝