欢迎来到天天文库
浏览记录
ID:61499526
大小:44.00 KB
页数:6页
时间:2021-02-07
《嵌入式操作系统内核原理和开发(通用优先级调度).doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、嵌入式操作系统内核原理和开发(通用优先级调度)相比较其他调度算法而言,时间片的轮转更多的注重公平性。但是,任务与任务之间也是有先后之分的,有的任务我们希望多安排一些时间片,而有的任务我们则希望少安排一些时间片。比较说,如果我们在上网的话,我们就希望上网的操作响应的更快一些;如果我们在进行GUI操作,我们当然就希望图形响应更快一些。这些都是可以理解的,下面我们就绪要对数据结构进行一些修改。[cpp]viewplaincopy1typedefstruct_TASK_INFO2{3UINT32id;4UINT32
2、*stack;5UINT32size;6UINT32context;7UINT32priority;8UINT32time_slice;9void(*func)();1011}TASK_INFO;这里的priority就是当前线程的优先级,所以最简单的方法就是根据priority直接分配对应的time_slice。也就是这个函数,[cpp]viewplaincopy12voidreset_time_slice()13{14intindex;1516for(index=0;index3、UMBER;index++)17gAllTask[index].time_slice=gAllTask[index].priority+1;18}所以,以后每次调度的时候,我们就首先寻找当前最高优先级的任务,看看当前任务安排的时间片是否用完了,没有用完就继续运行。如果当前优先级的任务已经没有时间片了,那么此时就可以安排低优先级的任务进行调度了。[cpp]viewplaincopy19voidsignal_handler(intm)20{21intindex;2223start:24index=find_ne4、xt_thread();25if(-1==index)26{1reset_time_slice();2gotostart;3}45gAllTask[index].time_slice--;6current_thread_id=index;7swap(&old,&gAllTask[current_thread_id].context);8}下面,我们就根据任务优先级挑选下一个需要运行的thread了,[cpp]viewplaincopy9intfind_next_thread()10{11intindex;15、213for(index=THREAD_MAX_NUMBER-1;index>=0;index--)14{15if(0!=gAllTask[index].time_slice)16break;17}1819returnindex;20}整个代码的流程也不复杂,大家可以运行、单步调试一把,试试看。[cpp]viewplaincopy21#include22#include23#include24#include25#include6、sert.h>26#include27#include2829#defineUINT32unsignedint30#defineSTACK_LENGTH51231#defineTHREAD_MAX_NUMBER103233typedefstruct_TASK_INFO34{35UINT32id;36UINT32*stack;37UINT32size;38UINT32context;1UINT32priority;2UINT32time_slice;3void(*f7、unc)();45}TASK_INFO;67staticstructitimervaloldtv;8UINT32old=0;9UINT32count=0;10UINT32task_stack[THREAD_MAX_NUMBER][STACK_LENGTH]={0};11TASK_INFOgAllTask[THREAD_MAX_NUMBER]={0};12UINT32current_thread_id=0;1314voidset_timer()15{16structitimervalitv;17itv.it_8、interval.tv_sec=1;18itv.it_interval.tv_usec=0;19itv.it_value.tv_sec=1;20itv.it_value.tv_usec=0;21setitimer(ITIMER_REAL,&itv,&oldtv);22}2324voidswap(UINT32*prev,UINT32*next)25{26__asm("push%%eaxt"27"push%%e
3、UMBER;index++)17gAllTask[index].time_slice=gAllTask[index].priority+1;18}所以,以后每次调度的时候,我们就首先寻找当前最高优先级的任务,看看当前任务安排的时间片是否用完了,没有用完就继续运行。如果当前优先级的任务已经没有时间片了,那么此时就可以安排低优先级的任务进行调度了。[cpp]viewplaincopy19voidsignal_handler(intm)20{21intindex;2223start:24index=find_ne
4、xt_thread();25if(-1==index)26{1reset_time_slice();2gotostart;3}45gAllTask[index].time_slice--;6current_thread_id=index;7swap(&old,&gAllTask[current_thread_id].context);8}下面,我们就根据任务优先级挑选下一个需要运行的thread了,[cpp]viewplaincopy9intfind_next_thread()10{11intindex;1
5、213for(index=THREAD_MAX_NUMBER-1;index>=0;index--)14{15if(0!=gAllTask[index].time_slice)16break;17}1819returnindex;20}整个代码的流程也不复杂,大家可以运行、单步调试一把,试试看。[cpp]viewplaincopy21#include22#include23#include24#include25#include6、sert.h>26#include27#include2829#defineUINT32unsignedint30#defineSTACK_LENGTH51231#defineTHREAD_MAX_NUMBER103233typedefstruct_TASK_INFO34{35UINT32id;36UINT32*stack;37UINT32size;38UINT32context;1UINT32priority;2UINT32time_slice;3void(*f7、unc)();45}TASK_INFO;67staticstructitimervaloldtv;8UINT32old=0;9UINT32count=0;10UINT32task_stack[THREAD_MAX_NUMBER][STACK_LENGTH]={0};11TASK_INFOgAllTask[THREAD_MAX_NUMBER]={0};12UINT32current_thread_id=0;1314voidset_timer()15{16structitimervalitv;17itv.it_8、interval.tv_sec=1;18itv.it_interval.tv_usec=0;19itv.it_value.tv_sec=1;20itv.it_value.tv_usec=0;21setitimer(ITIMER_REAL,&itv,&oldtv);22}2324voidswap(UINT32*prev,UINT32*next)25{26__asm("push%%eaxt"27"push%%e
6、sert.h>26#include27#include2829#defineUINT32unsignedint30#defineSTACK_LENGTH51231#defineTHREAD_MAX_NUMBER103233typedefstruct_TASK_INFO34{35UINT32id;36UINT32*stack;37UINT32size;38UINT32context;1UINT32priority;2UINT32time_slice;3void(*f
7、unc)();45}TASK_INFO;67staticstructitimervaloldtv;8UINT32old=0;9UINT32count=0;10UINT32task_stack[THREAD_MAX_NUMBER][STACK_LENGTH]={0};11TASK_INFOgAllTask[THREAD_MAX_NUMBER]={0};12UINT32current_thread_id=0;1314voidset_timer()15{16structitimervalitv;17itv.it_
8、interval.tv_sec=1;18itv.it_interval.tv_usec=0;19itv.it_value.tv_sec=1;20itv.it_value.tv_usec=0;21setitimer(ITIMER_REAL,&itv,&oldtv);22}2324voidswap(UINT32*prev,UINT32*next)25{26__asm("push%%eaxt"27"push%%e
此文档下载收益归作者所有