精华内容
下载资源
问答
  • 可变精度衰减调制的Linux嵌入式任务调度算法.pdf
  • 操作系统调度算法是现代操作系统实现多任务功能的核心。本文针对嵌入式操作系统实时性的要求,研究了几种经典的实时调度算法,分析了各个算法的具体原理和优缺点。在嵌入式Linux系统原有调度算法基础上,采用移植LSF...
  • 嵌入式Linux任务调度算法实时性优化.pdf
  • 嵌入式Linux任务调度算法实时性优化
  • 嵌入式实时操作系统任务调度算法的改进与应用嵌入式实时操作系统任务调度算法的改进与应用
  • 利用μC/OS嵌入式操作系统的任务调度算法,巧妙地实现了简易的嵌入式数据管理。首先详细描述了μC/OS任务调度算法的原理,在此基础上提出了利用该算法实现嵌入式数据管理的基本思想,最后根据实际应用需要,对该算法...
  • #资源达人分享计划#
  • 嵌入式实时操作系统任务调度算法

    千次阅读 2016-06-12 22:14:49
    任务调度

    嵌入式实时操作系统任务调度通常采用的算法是:

    基于优先权的抢占式调度。

    展开全文
  • 本文利用μC/OS嵌入式操作系统的任务调度 算法并加以改进,巧妙地实现了简易的嵌入式数据管理,与传统方法比较,该方法具备不出现存储空间碎片、数据管理操作效率高等优点,可广泛应用于低端嵌入式应用中的数据管理...
  • 针对嵌入式实时系统任务调度问题,讨论综合截止期和关键度两种特征参数的任务调度策略。引入动态策略的概念,采用任务分组优先级分段的方式,通过判断函数的判断动态选择调度策略,利用可达截止期优先降低任务错失率...
  • 引言随着嵌入式实时操作系统应用的不断深入,多个实时任务并发执行,再加上任务之间不停地动态切换,这对任务调度算法提出了较高的要求。实时操作系统中各个任务的优先级是不同的,而且经常会遇到超负荷的情况.。在...

    引言

    随着嵌入式实时操作系统应用的不断深入,多个实时任务并发执行,再加上任务之间不停地动态切换,这对任务调度算法提出了较高的要求。实时操作系统中各个任务的优先级是不同的,而且经常会遇到超负荷的情况.。在这种超载情况下,使任务集内各任务满足各自的时限,嵌入式操作系统必须保证在确定的时间内对事件进行处理,因此必须要有一个良好的任务调度算法。周期任务和非周期任务是实时嵌入式系统中的常见任务类型,系统实时任务调度策略主要包括时间驱动调度策略、优先级驱动调度策略。常见的动态优先级调度算法有最早截止期优先调度算法和最小空闲时间优先算法、单调速率调度算法和最大价值优先算法等。

    实时系统的任务按产生请求的频率可分为周期性任务与非周期性任务:周期性任务按照固定的请求间隔持续地产生请求,不同的任务请求间隔不一定相同。 非周期性任务在任意一段时间间隔内可能产生不定数量的请求。按任务优先级分配方式可分为静态优先级任务和动态优先级任务。

    1)固定优先级调度算法

    在实时调度算法中,固定优先级调度算法事先根据任务的属性,如任务的周期、截止期限等为系统中的所有任务静态分配一个优先级。当任务的截止期限等于周期时,提出了RMS调度算法,它根据任务的执行周期长短的不同来决定优先级,即任务的周期越小优先级越高,任务的周期越大优先级越低。以RMS为代表的固定优先级调度算法,一方面不仅具有运行时间开销小和易于实现的优点,而且在系统超载情况下,仍然可以保证高优先级的任务得到执行;但另一方面却是不能充分地利用系统资源。

    2)动态优先级调度算法

    在实时调度算法中,动态优先级调度算法根据任务资源需求的变化以及任务的属性,如任务周期、截止期限等动态地决定任务的优先级。当任务的截止期限等于周期时,提出了EDF调度算法,该算法根据就绪队列中任务的截止期限分配优先级,距离绝对截止期限的最近的任务具有最高的优先级,即任务的绝对截止期限越小优先级越高,任务的绝对截止期限越大优先级越低。以EDF为代表的动态优先级调度算法,一方面可以充分地利用系统的资源;但是另一方面在系统负荷严重超载时,系统性能很不稳定,导致大多数任务在截止期限到来之时仍无法满足。

    3)静态优先调度算法与动态优先调度算法的比较

    静态调度是指系统脱机地进行调度可行性分析后生成一个可调度表,在运行的过程中,调度表中的信息不再发生任何变化。该类调度算法假定系统实时任务的属性是提前已知的并且在执行过程中很少发生变化,特别适合于对那种确定问题的求解,具有较好的可预测性。

    单调速率调度算法(Rate Monotonic Algorithm, RM)

    单调速率调度算法是一种被广泛使用的调度算法, 并且已被证明是一种最佳的静态优先级算法。单调速率调度(RMS)算法是C.L.Liu和J.W.Layland在1973年引入提出的一种基于周期和多任务的静态优先级可抢占调度算法。RMS是针对周期任务的优先级调度算法,当任务的截止时间等于其周期时,RMS算法已被证明是静态最优的调度算法。

    当较低优先级的进程正在运行并且较高优先级的进程可以运行时,较高优先级进程将会抢占低优先级。在进入系统时,每个周期性任务会分配一个优先级,它与其周期成反比,即周期越短,优先级越高;周期越长,优先级越低。这种策略背后的理由是:更频繁地需要 CPU 的任务应分配更高的优先级。此外,单调速率调度假定:对于每次 CPU 执行,周期性进程的处理时间是相同的。也就是说,在每次进程获取 CPU 时,它的 CPU 执行长度是相同的。

    db96807f5fbad9c8f6aa16911577fdd3.png

    假设有两个进程 P1 和 P2。P1 和 P2 的周期分别为 50 和 100,即 ρ1 = 50 和 ρ2= 100。P1 和 P2 的处理时间分别为 t1 = 20 和 t2 = 35。每个进程的截止期限要求,它在下一个周期开始之前完成 CPU 执行。
    首先,P1 开始,并在时间 20 完成 CPU 执行,从而满足第一个截止期限。P2 在这点开始运行,并运行直到时间 50。此时,它被 P1 抢占,尽管它的 CPU 执行仍有 5ms 的时间。P1 在时间 70 完成 CPU 执行,在这点调度器恢复 P2。P1 在时间 75 完成 CPU 执行,也满足第一个截止期限。然后,系统一直空闲直到时间 100,这时,P1 再次被调度。
    单调速率调度可认为是最优的,因为如果一组进程不能由此算法调度,它不能由任何其他分配静态优先级的算法来调度。

    最早截止时间优先(Earliest DeadlineFirst, EDF)

    最早截止时间优先EDF算法是非常著名的实时调度算法之一。EDF调度算法是单处理器环境下调度性能最优的一种动态调度系统任务的算法。EDF调度算法的优先级是以所调度任务的截止期与当前时刻的差值来确定的差值越小证明任务的截止期越早,与其他差值大的任务相比优先级就越高,越需优先执行避免错过任务截止期而导致任务夭折。因此,采用EDF调度算法可以保证当前离截止期最近的任务获得系统资源和控制权,优先进行调度。EDF调度算法最大的优点是大幅度提升处理器的利用率,采用EDF调度算法进行调度时,处理器的利用率可以达到最大值。 但EDF调度算法在进行任务调度时系统开销较大,且任务调度过程中无法对系统负载情况进行量化判断,无法应对系统高负载情况下的任务调度问题。EDF算法在调度过程中存在任务错失截止期的情况,进而影响其他等待调度任务的正常调度,致后续多个任务错失截止期而夭折。在系统超负载的情况下调度算法会导致系统任务调度的成功率大幅度降低,影响嵌入式系统的实时调度性能。

    在每一个新的就绪状态,调度器都是从那些已就绪但还没有完全处理完毕的任务中选择最早截止时间的任务,并将执行该任务所需的资源分配给它。在有新任务到来时,调度器必须立即计算EDF,排出新的定序,即正在运行的任务被剥夺,并且按照新任务的截止时间决定是否调度该新任务。如果新任务的最后期限早于被中断的当前任务,就立即处理新任务。按照EDF算法,被中断任务的处理将在稍后继续进行。该算法的思想是从两个任务中选择截至时间最早的任务,把它暂作为当前处理任务,再判断该任务是否在当前周期内,若不在当前周期内,就让另一任务暂作当前处理任务,若该任务也不在当前周期内,就让CPU空跑到最靠近的下一个截至时间的开始,若有任务在该周期内,就判断该任务的剩余时间是否小于当前截至时间与当前时间的差,若小于,则让该任务运行到结束。否则,就让该任务运行到该周期的截止时间,就立即抢回处理器,再判断紧接着的最早截至时间,并把处理器给它,做法同上,如此反复执行。

    最小空闲时间优先算法(Least Slack First,LSF)

    最小空闲时间优先LSF算法结合任务执行的缓急程度来给任务分配优先级。任务所剩的空闲时间越少,就越需要尽快执行。最小空闲时间优先调度算法改进了EDF算法的性能,算法中任务优先级由任务空闲时间片数值来决定, 即任务截止时间与剩余执行时间之差,空闲时间片数值越小,任务优先执行的级别越高,LSF调度算法通过紧急任务优先执行策略一定程度上解决了EDF算法存在的问题,但调度算法存在任务调度频繁抢占问题,增加了系统的开销同时也降低了实时系统的性能。

    展开全文
  • 摘要: 介绍μC/OS-II嵌入式实时操作系统的特点,分析单一的基于优先级调度算法存在的不足。根据嵌入式应用不同的实时性要求,将应用划分为实时任务、分时任务和后台任务三种类型。针对分时任务,新增加时间片调度...
  • 采用Forth虚拟机技术,对基于Forth虚拟机架构的嵌入式操作系统关键技术进行探索,提出一种具有良好扩展和移植特性、高效精简的基于Forth虚拟机架构的嵌入式任务操作系统调度算法。该算法采用了以Forth虚拟机指令...
  • 嵌入式Linux多任务实时调度算法及应用研究.pdf
  • 本文利用μC/OS嵌入式操作系统的任务调度 算法并加以改进,巧妙地实现了简易的嵌入式数据管理,与传统方法比较,该方法具备不出现存储空间碎片、数据管理操作效率高等优点,可广泛应用于低端嵌入式应用中的数据管理...
  • 引言  一般情况下,在嵌入式系统中实现数据管理我们常采用嵌入式数据库。但是目前常用的嵌入式数据库(如SQLite、Berkeley DB等)均需嵌入式操作系统的支持,且对嵌入式系统的...本文提出了一种利用μC/OS任务调度
  • 嵌入式系统分时任务调度算法实现

    千次阅读 2014-06-02 13:22:55
    嵌入式高级特性编程之管理你的任务   2014酷玩创意     直奔主题,今天我们讲的是定时任务处理。简单讲就是我有一系列的任务需要在将来的某个特定时间由系统去处理。补充一下这里的将来去处理不是系统就可以...

     

    嵌入式系统分时任务调度算法实现

     

    -                                                            2014 酷玩创意

     

     

           直奔主题,今天我们讲的是定时任务处理。简单讲就是我有一系列的任务需要在将来的某个特定时间由系统去处理。补充一下这里的将来去处理不是系统就可以延时阻塞当前的任务,这样的情况没有什么研究的价值,我们说的是在定时时间到达后系统中断当前任务处理定时任务,完了再回到主线程继续运行。

            不知道大家平时有没有遇到过这种需求。就拿之前我们说到过的红外解码的干扰控制:一次成功接收到红外按键后你至少需要在500ms到1000ms后重新打开红外接收的中断,这期间你也不可能用最土的延时等待的方法让系统阻塞在解码函数里(假设你正在控制高速运转的机器,阻塞操作岂不是作死的节奏啊!),这个时候你该整么办呢?

            像MCU这样的器件一般运行在没有操作系统的环境中程序就一个循环到底,要做到这样一点似乎有些困难。我们应该明确处理定时的入口应该是中断机制,要不然这种东西就根本没有第二种方法可能了,他又是和时间强相关的任务,结合我们之前讲到的系统时间戳概念其实我们就可以找到解决问题的办法了!

            这里采用的分时操作的原理即:我们在系统时钟中断中查询系统设置的任务和超时时间,如果判断时间到达我们就执行相应任务我们称之为job。从本质上来讲,其实这和操作系统的时间片的操作相似,在某一个时间系统只会处理一个任务,系统的多线程和多任务不过是分时复用的结果。电脑速度那么快我们感觉就是CPU在并行处理多个任务一样。当然为了更好的管理这些定时任务我们需要做一些数据结构的设计。

            下面就是代码时间了,代码才是程序猿的自我修养啊!



    Job数据结构设计

     

            这里我们在一个Job里面定义了time用于job被添加的时间统计,timeout是超时时间,即job会要被执行的时间持外最重要的是job执行体hand 是一个函数指针。在我们的应用中设置了最多10个定时任务,这相当于线程池的概念 如图。

     

            要将任务动态的加载到系统中,我们通过



    任务添加

     

            查询系统未使用的job ID将我们要处理的任务添加到全局的Job队列里面(暂且这么叫吧)。

     

            很明显接下来就是job的中断查询和处理的问题了,贴上之前用过的一张图:



     任务查询处理


            我想到这里大家应该都知道该怎么去做了,这里给出的是一种处理的思路,感兴趣的哥们可以看看我们的工程代码。


    完整代码工程可通过http://shop108911095.taobao.com/?spm=2013.1.0.0.Z8tf8S取得

     

    更多趣味算法、应用更新中。


    展开全文
  • 摘要: μC/OSII是源码公开的嵌入式实时操作系统,其任务调度算法的实现颇为精彩。本文对该算法做了简要分析,指出对于一些有硬件算法指令的处理器,仅做移植并直接使用其软件算法是不明智的,相关硬件指令为μC/OSII...
  • 嵌入式Linux实时调度算法及应用.pdf
  • 嵌入式Linux实时调度算法的优化设计.pdf
  • 文章针对负载难以准确预知且动态变化的复杂分布实时嵌入式系统,提出了一种基于快速模型预测控制的任务调度算法,通过动态调整分配在各个处理器上的任务QoS,使得每个处理器的CPU在参考值附近,保证了任务的实时性;...
  • 嵌入式Linux中调度算法的实现及优化.pdf
  • 一种新的嵌入式Linux实时调度算法.pdf
  • 进互联网公司操作系统和网络库是基础技能,面试过不去的看,这里基于嵌入式操作系统分几章来总结一下任务调度、内存分配和网络协议栈的基础原理和代码实现。处理器上电时会产生一个复位中断,接下来会执行复位中断...

    进互联网公司操作系统和网络库是基础技能,面试过不去的看,这里基于嵌入式操作系统分几章来总结一下任务调度、内存分配和网络协议栈的基础原理和代码实现。

    处理器上电时会产生一个复位中断,接下来会执行复位中断服务函数,这才是软件执行的起始点。复位函数先后调用SystemInit和__main函数,SystemInit是处理器自带的库函数,一般执行各种时钟和外设的初始化;__main函数执行C语言运行环境的初始化,包括将目标程序从flash搬运到RAM、初始化全局变量等内存段初值,初始化C语言库函数等操作,最后跳转到main函数,执行用户程序。不同型号的处理器启动流程不太一致,如果不是需要设计bootloader,可以没必要关心。

    mian的主要工作大致为:内存初始化、硬件中断初始化,此外还会分配基础的资源如锁、信号量等,最后创建idletask。idletask任务优先级最低,里面一般循环执行WFI指令使芯片保持低功耗状态。

    任务相关结构初始化很简单,主要是分配任务块空间,并挂接在freelist链表上。后续分配任务时,从freelist链表上取就行。

    4646f9ed4e73675a850ce866a7641bd7.png

    接下来看看任务创建的步骤:

    首先将需要回收的任务资源挂在freetasklist上去。这里是尽量延迟了任务的回收时间,不是在任务该回收的时候而是在新任务创建的时候回收旧任务。这样可以尽量减少CPU占用。所以每次新建任务,都是从freetasklist链表上取一个TCB下来然后根据用户需求分配栈大小,设置任务优先级和入口函数等。这里要注意操作freetasklist的过程中要关闭中断,防止操作过程中来了中断引起任务调度,导致crash。这里写代码需要注意因为参数检查、分配内存等流程都有可能出错,在设计程序的时候最好统一收口,所有错误有一个统一的出口处理,这样可以防止遗忘开中断等重要操作。大致流程如下:

    96f7e536743cb60bce0043b496c8c1ba.png

    从freelist头部摘取一个任务块,并分配任务栈空间、设置优先级等,新创建的任务需要挂接到priqueue链表数组中等待任务调度:

    89616e47da52b06c791111973b8d64fd.png

    这里有个小知识点,一般的链表指向的都是结构体的首部,这样可以将链表指针直接强制转换成对应的数据结构(这里是任务块)。而在任务队列中链表位于任务块结构体中间,需要用宏来获取到链表指针对应的任务块首地址,这个宏的实现大同小异,各个操作系统都是借鉴Linux来实现的,详情百度:list_entry。

    接下来就要说说操作系统是怎么做到常数级的任务切换时间的。初学者写的操作系统任务调度功能时可能会出现一种场景,那就是任务量少的时候任务切换时间快,任务量多的时候任务切换时间变慢,这种任务切换耗时不确定对用户任务影响时非常大的。我们来看看ucos系统是如何设计来保证常数级任务切换时间的。

    一个全局的priqueue链表数组,上面挂接ready状态的任务队列,一个全局int32数,用于标记某优先级是否有需要调度的队列。要扩展到128位优先级也非常方便,设置4个int32数组即可。每次取优先级最高的任务,直接用CLZ汇编命令从bitmap中读出需要调度的最高优先级任务。

    09090bdb57ad8ed9ec3f2f1f88420203.png

    插入ready任务的时候需要将bitmap对应位置1,任务从ready状态移除的时候需要检查该优先级是否还有需要调度的任务,如果没有了,bitmap对应位需要置0。讲完嵌入式操作系统的进程调度,再来看看Linux的CFS的基础原理,就好理解多了,嵌入式系统低优先级队列可能会存在饿死现象,Linux的CFS调度算法给每个优先级分配了不同权重,根据就绪队列里所有任务的权重之和来分配任务的时间,来保证完全公平调度。

    内存分配

    前面分配任务块、分配任务栈等都用到了内存分配动作,具体的内存分配算法有:best-fit算法、TLSF算法、LWIP中的最快匹配算法、伙伴算法等,基础原理类似,下期再分析。

    时钟中断

    适配操作系统首要任务就是把时钟tick给起起来,这是芯片的心跳,所有的任务切换和延时操作都是基于时钟tick中断驱动的。

    以ARM芯片的Cortex-M3核为例,启动时钟中断主要是调用osSetVector将tick回调函数设置进中断向量表里面的15号中断:

    2c066e02a49f25b925e95c4e753c918d.png

    中断向量表长这样子:

    45ebd7cb8fe2c93fab7af22dac7e658f.png

    前面15个中断号属于系统中断,后面预留中断号可供用户配置,M3是240个,M0是32个。

    结合PendSV中断,可以在tick中断中完成别的事物(如定时器处理等),通过低优先级的PendSV中断来执行任务切换动作,从而减少中断响应时间。具体的分析在之前文章中:嵌入式操作系统的任务调度

    00afb30891ea45ad19c5f37d4ca23e3f.png

    在设置tick中断的时候还需要配置systick定时器的中断间隔。systick定时器是个简单的向下计数的24位计数器,寄存器位置位于系统控制空间基址SysTick_BASE偏移16字节,将需要的频率数值写入即可。systick寄存器的内部细节为:

    766e023e768b6f1392940b86246d5b3e.png

    详情可参考《ARM Cortex-M3 Cortex-M4权威指南》9.5节systick相关部分,其余相关linux中断知识可参考:Linux中断编程

    顺带说一下,如果职业规划是往互联网方向转,那么寄存器硬件知识了解即可。如果想在物联网嵌入式领域深耕,不同ARM芯片之间的区别是一定要掌握的。

    我们可以给tick中断配置为每10ms中断一次,防止过多的任务上下文切换占用CPU资源。中断到来后系统都要处理哪些事务呢?通常情况下会维护一个全局计数器,该中断到来时变量自增,然后会处理定时器任务和超时任务。

    超时任务是什么呢?比如用户任务等待某个资源(锁、信号量等),如果获取不到就会设置超时时间阻塞等待,直到资源可用或者任务超时。因此每次时钟中断到来都需要判断是否有任务超时。

    定时器任务就比较简单了,可以使用全局链表有序挂接定时任务,每次只需要判断链表头的任务是否到时,到时了摘取下来执行对应的回调函数即可。

    95a0ca0acc2946a5eece6d044e014bad.png

    不同的操作系统可能会在tick中断里面做一些别的事情,比如定时器对齐等。

    貌似还有很多没写完,下周末再来总结。最后推荐嵌入式操作系统入门的三本书:《嵌入式操作系统内核调度--底层开发者手册》、《嵌入式网络那些事--STM32物联实战》、《ARM Cortex-M3 Cortex-M4权威指南》

    f35e03832bd27438d1fef1db7d2fa5ee.png

    展开全文
  • 任务调度算法汇总

    万次阅读 2016-10-05 13:54:54
    任务调度算法汇总
  • 技术论文,站点首页,技术,嵌入式系统
  • μC/OSII是源码公开的嵌入式实时操作系统,其任务调度算法的实现颇为精彩。本文对该算法做了简要分析,指出对于一些有硬件算法指令的处理器,仅做移植并直接使用其软件算法是不明智的,相关硬件指令为μC/OSII的优化...
  • FreeRTOS的任务调度算法优化实现

    千次阅读 2016-07-22 21:42:15
    本文先对FreeRTOS的任务调度算法进行分析,接着借鉴了UCOSII系统的两级查表方法,对该流程进行优化,最后用两种方法测试同一测试用例,可以清楚的看到优化的效果。 FreeRTOS任务调度算法分析 FreeR

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,587
精华内容 6,634
关键字:

嵌入式任务调度算法