uc/OSIII 任务使用

任务的组成

  • 任务堆栈:上下文切换用于保存任务当前环境。
  • 任务控制块:保存任务的各个属性
  • 任务函数:完成指定功能

API接口

TablesAre
OSTaskCreate创建任务
OSTaskSuspend任务挂起
OSTaskResume任务恢复
OSSchedRoundRobinCfg时间片配置
OSSchedRoundRobinYield放弃时间片

任务创建

//任务优先级
#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();
  • 在没有使用时间片轮转的时候,任何任务的优先级不能相同
  • 第一个任务创建和初始化需要注意顺序

任务删除

void  OSTaskDel (OS_TCB  *p_tcb, //需要删除的PCB
                 OS_ERR  *p_err) //错误信息

任务挂起

    void   OSTaskSuspend (OS_TCB  *p_tcb, 
                      OS_ERR  *p_err)
 ```
 ##任务恢复
 ```
void  OSTaskResume (OS_TCB  *p_tcb,
                    OS_ERR  *p_err)

时间片轮转

时间片调度是通过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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值