嵌入式操作系统内核原理和开发(通用优先级调度).doc

嵌入式操作系统内核原理和开发(通用优先级调度).doc

ID:61499526

大小:44.00 KB

页数:6页

时间:2021-02-07

嵌入式操作系统内核原理和开发(通用优先级调度).doc_第1页
嵌入式操作系统内核原理和开发(通用优先级调度).doc_第2页
嵌入式操作系统内核原理和开发(通用优先级调度).doc_第3页
嵌入式操作系统内核原理和开发(通用优先级调度).doc_第4页
嵌入式操作系统内核原理和开发(通用优先级调度).doc_第5页
资源描述:

《嵌入式操作系统内核原理和开发(通用优先级调度).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;index

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#include

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。