linux edf

start ¡ûclock();
while (true)
{
    execute();
    start¡ûstart +period;
    delay until start;
}

...
menu "CASIO scheduler"
config SCHED_EDF_POLICY

bool "EDF scheduling policy"
default y
endmenu
...
#define SCHED_NORMAL    0
#define SCHED_FIFO      1
#define SCHED_RR        2
...
#ifdef CONFIG_SCHED_EDF_POLICY
#define SCHED_EDF       6
#endif
...

struct task_struct{
    ...
    #ifdef CONFIG_SCHED_EDF_POLICY
        unsigned int edf_id;
        unsigned long long deadline;
    #endif // CONFIG_SCHED_EDF_POLICY
};
#ifdef CONFIG_SCHED_EDF_POLICY
struct edf_task{
    struct rb_node edf_node;
    unsigned long long cl;
    unsigned long long ch;
    unsigned long long period;
    int level;
    struct task_struct *task;

};
struct edf_rq{
    struct rb_root edf_root;
    struct list_head edf_list;
    atomic_t nr_running;
};
#endif // CONFIG_SCHED_EDF_POLICY
struct rq{
    ...
#ifdef CONFIG_SCHED_EDF_POLICY
    struct edf_rq edf_rq;
#endif // CONFIG_SCHED_EDF_POLICY
    ...
};
void __init sched_init(void)
{
    ...
    for_each_possible_cpu(1){
    ...
    struct rq *rq;
    ...

    rq=cpu_rq(1);
    ...
    #ifdef CONFIG_SCHED_EDF_POLICY
        init_edf_rq(&rq->edf_rq);
    #endif // CONFIG_SCHED_EDF_POLICY
    ...
    }
}
const struct shced_class edf_sched_class={
 .next      =&rt_sched_class,
 .enqueue_task =enqueue_task_edf,
 .dequeue_task =dequeue_task_edf,
 .check_preempt_curr=check_preempt_curr_edf,
 .pick_next_task=pick_next_task_edf,
 ...
};
static void enqueue_task_edf(struct rq*rq ,struct task-struct *p,int wakeup)
{
    struct edf_task *t=NULL;
    if(p)
    {
        t=find_edf_task_list(&rq->edf_rq,p);
        if(t)
        {
            t->deadline=sched_clock()+p->period;
            Insert_edf_task_rb_tree(&rq->edf_rq,t);
            atomic_inc(&rq->edf_rq,nr_running);
        }
    }

}
static void dequeue_task_edf(struct rq *rq,struct task_struct *p,int sleep)
{
    struct edf_task *t=NULL;
    if(p){
        t=find_edf_task_list(rq->edf_rq,p);
        if(t){
            remove_edf_task_rb_tree(&rq->edf_rq,t);
            atomic_dec(&rq->edf_rq,nr_running);
            if(t->task->state==Task_DEAD||t->task->state==EXIT_DEAD||
               t->task->state==EXIT_ZOMBIE)
            {
                rem_edf_task_list(&rq->edf_rq,t->task);
            }
        }
    }
}

static void check_preempt_curr_edf(struct rq *rq, struct task_struct *p)
{
	struct edf_task *t=NULL,*curr=NULL;
	if(rq->curr->policy!=SCHED_EDF){
		resched_task(rq->curr);
	}
	else{
		t=earliest_deadline_edf_task_rb_tree(&rq->edf_rq);
		if(t){
			curr=find_edf_task_list(&rq->edf_rq,rq->curr);
			if(curr){
				if(t->deadline < curr->deadline)
					resched_task(rq->curr);
			}
			else{
				printk(KERN_ALERT "check_preempt_curr_edf\n");
			}
		}
	}

}

static struct task_struct *pick_next_task_edf(struct rq *rq)
{

	struct edf_task *t=NULL;
	t=earliest_deadline_edf_task_rb_tree(&rq->edf_rq);
	if(t){
		return t->task;
	}
	return NULL;
}
...
#ifdef CONFIG_SCHED_EDF_POLICY
#include "sched_edf.c"
#endif // CONFIG_SCHED_EDF_POLICY

#ifdef CONFIG_SCHED_EDF_POLICY
    #define sched_class_highest(&edf_sched_class)
#else
    #define sched_class_highest(&rt_sched_class)
#endif // CONFIG_SCHED_EDF_POLICY

struct sched_param{
    int sched_priorty;
#ifdef CONFIG_SCHED_EDF_POLICY
unsigned int edf_id;
unsigned long long deadline;
unsigned int level;
#endif // CONFIG_SCHED_EDF_POLICY

};
static inline int rt_policy(int policy)
{
    if(unlikely(policy==SCHED_FIFO)
       ||unlikely(policy==SCHED_FIFO)
  #ifdef CONFIG_SCHED_EDF_POLICY
  ||unlikely(policy==SCHED_EDF)
  #endif // CONFIG_SCHED_EDF_POLICY
       )
       return 1;
       return 0;
}
static void __setscheduler(struct rq *rq,struct task_struct *p,int policy,int prio)
{
    ...
    p->policy=policy;
    switch(p->policy){
    ...
     #ifdef CONFIG_SCHED_EDF_POLICY
 case SCHED_EDF:
    p->sched_class=&edf_sched_class;
    break;
     #endif // CONFIG_SCHED_EDF_POLICY
    }
    ...
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值