下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 1最小的多线程框架调度原理

1最小的多线程框架调度原理.doc

1最小的多线程框架调度原理

平凡的程序员小强
2018-09-04 0人阅读 举报 0 0 暂无简介

简介:本文档为《1最小的多线程框架调度原理doc》,可适用于工程科技领域

资料来源电子下载网下载时间::本文地址http:ujjcomshejiqianrushihtml最小的多线程框架调度原理引言  由于资源和成本的限制前后台系统是位MCU上的主流。本文介绍的方法可以在位MCU上进行任务切换代码编译后大约字节。用户把代码从原来的前后台系统移到多线程框架时可以去掉很多条件语句从而又节约了代码。也就是说既提高了性能又没有增加代码长度同时也不需要改变原来的编程方式只是对原有的函数进行调度。可以在KBROM和字节RAM的MCU上运行。 调度原理①用字节变量的每一位代表一个任务是否就绪为就绪为休眠。②这个字节从高位到低位代表的任务优先级也从高到低。③通过查表从就绪的任务中找出优先级最高的任务并执行同时清就绪标志。  就绪表ThreadReadyList如下:  上述表示有两个任务――任务和任务就绪。  因为位优先级高我们来查表:PRIORITYTABLE={,,,,,,,,,,,,,,,}ready=ThreadReadyListif(ready!=){  if((readyxF)!=U){    prionum=PRIORITYTABLEready>>  }else{    prionum=PRIORITYTABLEready  }}  查表结果为=  计算结果为,所以优先级为的任务先执行并清就绪位。完成后再次计算结果为优先级为的任务再执行。 任务就绪方法  任务就绪是一个宏写成宏是因为在某一些MCU的编译器中规定不能在中断中调用函数。  #defineThreadSet(prio)(ThreadReadyList|=(  比如在定时器中让优先级为的任务就绪:  ThreadSet()  实际操作为:  ThreadReadyList|=x(编译成汇编代码只一条指令)  把就绪表的第位置。 任务运行方法  任务运行方法有两种:一种是switch另一种是函数指针。  因为有些位机的C编译器不支持函数指针所以本文只介绍switch方式。(注:作者在ARM的多线程框中用的是函数指针)。  在调度原理中计算出优先级号码prionum:switch(prionum){  case:最高优先级任务的函数放在这里    break  case:任务的函数放在这里    break  …… } 任务就绪表上电初始化及完整的任务调度函数()任务就绪表上电初始化  ThreadReadyList=在调度前把就绪表清即可()完整的任务调度函数voidThreadScheduler(void){  INTUprionum,ready  prionum=  ready=ThreadReadyList  if(ready!=){    if((readyxF)!=U){找出就绪表中优先级最高的任务      prionum=PRIORITYTABLEready>>    }else{      prionum=PRIORITYTABLEready    }    ready=READYCLRANDprionum    OSENTERCRITICAL()关中断    ThreadReadyList=ready清就绪位    OSEXITCRITICAL()开中断    switch(prionum){      case:最高优先级任务        break      case:任务        break      ……      case:任务        break      case:任务        break     }   }}  上面代码中用一个switch语句调用不同的任务函数看似有点笨但却解决了很多位机的编译器不支持函数指针的问题同时不影响执行效率。如果编译器支持函数指针就可以把上面的代码改成查表表格为对应的函数指针代码会短很多。 程序编写方法()主函数voidmain(void){  InitialMCU()  ThreadReadyList=  while(){    ThreadScheduler()  }}  主循环只有一条语句调用一个函数就可以了改变了整个程序的结构。主循环中不会有很多的条件语句去判断哪个程序该执行了而是在条件满足时置就绪标志由调度器去调度。()中断函数voidISRTimer(void){  TmrCtr  if(TmrCtr>){ms    TmrCtr=    ThreadSet()让定时执行的任务就绪  }}voidISRAD(void){  adf=  ADValue=adrh  ThreadSet()让计算任务就绪}()任务函数  和其他函数没有区别。voidAlarmOut(){  if(AlarmOutctr>){    AlarmOutctr    PFDOUT=!PFDOUT    TmrStart(,)s  }else{    ConctrolStat=ENDSTAT    PFDOUT=  }} 使用任务调度的优势①多个线程同时就绪时高优先级先执行。②高优先级线程最长等待时间是上一个正执行线程的完成时间。③因为最长的主循环时间是最长线程的执行时间所以有些中断中执行的代码可以移到任务中。④可以减少条件语句。⑤使软件结构更合理、清晰。结语  本文介绍的方法在Holtek系列位MCU和NXP公司的LPC中已有数十个项目的应用并且在此基础上把switch改为函数指针加上事件队列和事件延迟后在LPC的ARM上成功应用。卢海军主要研究方向为嵌入式软件架构、构件和编程方法。推荐阅读:(按住Ctrl鼠标左键点击标题可以打开详细内容)、IC检测方法、什么是遥感技术、什么是无线网址、制冷设备维修技巧、什么是色温、手机RF设计问答、微波简史、微波小知识、卫星导航知识、卫星与遥感技术

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/5

1最小的多线程框架调度原理

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利