VxWorks时间片轮转调度

VxWorks时间片轮转调度

任务调度是基于某种规则约束,给一个任务集合中每个任务分配开始和结束的时间。约束方式一般分为时间片约束和资源约束。在VxWorks中,系统按照时间片依次轮流执行每个任务,从而造成多个任务在单个处理器上同时执行的假象。wind内核调度默认使用的是基于优先级抢占式调度,同时也允许使用轮转调度。轮转调度的目的是使用相同优先级的所有就绪任务共享CPU。如果不使用轮转调度,当多个优先级相同的任务需要共享CPU时,其中一个任务就会霸占CPU直到该任务完成或因为其他原因进入阻塞状态,从而使得其他相同优先级的任务得不到资源无法执行。

相关控制函数:
在VxWorks中,使用kernelTimrSlice() 函数允许轮转调度,时间片的大小由该函数的参数传入,它规定每个任务一次允许占用CPU的时间。
函数原型为:STATUS kernelTimeSlice( int ticks)
ticks为任务单词执行的时间,单位为ticks。

实例:

#include "VxWorks.h"
#include "taskLib.h"
#include "kernelLib.h"
#include "sysLib.h"
#include "logLib.h"

#define ITER1   100
#define ITER2   10
#define PRIORITY    101
#define TIMESLICE   sysClkRateGet()/60
#define LONG_TIME   (1<<25)

static void taskOne(void)
{
    int i, j;
    for(i=0; i<ITER1; i++)
    {
        for(j=0; j<ITER2; j++)
        {
            logMsg("/n",taskSelf(), 0, 0, 0, 0, 0);
        }
        for(j=0; j<LONG_TIME; j++);
    }
}


static void taskTwo(void)
{
    int i, j;
    for(i=0; i<ITER1; i++)
    {
        for(j=0; j<ITER2; j++)
        {
            logMsg("/n",taskSelf(), 0, 0, 0, 0, 0);
        }
        for(j=0; j<LONG_TIME; j++);
    }
}


static void taskThree(void)
{
    int i, j;
    for(i=0; i<ITER1; i++)
    {
        for(j=0; j<ITER2; j++)
        {
            logMsg("/n",taskSelf(), 0, 0, 0, 0, 0);
        }
        for(j=0; j<LONG_TIME; j++);
    }
}


void s5_rrsched(void)
{
    int taskIdone;
    int taskIdtwo;
    int taskIdthree;

    if(OK == kernrlTimeSlice(TIMESLICE))
    {
        logMsg("\n\n\n\n\t\tTIMESLICE = %d ticks\n\n\n",TIMESLICE, 0, 0, 0, 0, 0)
    }
    taskDelay(sysClkRateGet()*2);

    if(ERROR == (taskIdone = taskSpawn("task1", PRIORITY, 0X100, 2000, (FUNCPTR)taskOne(),0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
    {
        logMsg("taskSpawn taskone failed.\n");
    }


    if(ERROR == (taskIdtwo = taskSpawn("task2", PRIORITY, 0X100, 2000, (FUNCPTR)taskOne(),0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
    {
        logMsg("taskSpawn tasktwo failed.\n");
    }


    if(ERROR == (taskIdthree = taskSpawn("task3", PRIORITY, 0X100, 2000, (FUNCPTR)taskOne(),0, 0, 0, 0, 0, 0, 0, 0, 0, 0)))
    {
        logMsg("taskSpawn taskthree failed.\n");
    }
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值