tag 标签: 任务调度

相关博文
  • 热度 24
    2014-4-3 15:35
    2897 次阅读|
    0 个评论
         前天在做实验时,想在ucos ii 系统下触发一下外部中断玩玩,可没想到,按常归的中断要求编写完中断服务例程后,程序竟然跑飞了,触发按键中断后,我调试了一下,程序在一个默认的异常服务死循环里出不来了,我就郁闷了,想了之后,以为当OS 控制系统后在不同优先级任务间切换,不能再响应来自外部事件触发的中断呢,所以程序崩溃了呢,后来才发现,这是一个多么可笑的想法啊,呵呵,现在终于弄明白了,写点心得记录下来,以便完全理解。        看了ucos ii对中断的要求后才发现错哪了,任务调度之所以分为任务级任务调度和中断级任务调度,就是因为这个原因,学那么长时间了,竟然还不知道中断级任务调度是怎么调用了,悲剧啊,思而不学则殆,学而不思则惘,唉,把状态改了,以作警示,很明显,任务级任务调度是在任务间切换时调用的,具体什么时候调用呢?当一个任务有延时时,就会调用以便让一个更高优先级的任务进入就绪状态。而中断级任务调度呢,当然是在中断时调用以便让……这么简单的道理,怎么想不到呢?好像从来没想过这个问题……。       查资料后发现了这两个函数:OSIntEnter()和OSIntExit(),这两个函数是用来干啥呢?看源码吧!   void  OSIntEnter (void) {     if (OSRunning == TRUE)         {         if (OSIntNesting 255)              {             OSIntNesting++;                      /* Increment ISR nesting level                        */            }         } }          这个函数的源码真简单啊,不就是让一个变量加1吗?再来看一下注释:   Description: This function is used to notify uC/OS-II that you are about to service an interrupt *              service routine (ISR).  This allows uC/OS-II to keep track of interrupt nesting and thus *              only perform rescheduling at the last nested ISR. * . * Arguments  : none * * Returns    : none * * Notes      : 1) This function should be called with interrupts already disabled *              2) Your ISR can directly increment OSIntNesting without calling this function because *                 OSIntNesting has been declared 'global'.   *              3) You MUST still call OSIntExit() even though you increment OSIntNesting directly. *              4) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the *                 end of the ISR. *              5) You are allowed to nest interrupts up to 255 levels deep. *              6) I removed the OS_ENTER_CRITICAL() and OS_EXIT_CRITICAL() around the increment because *                 OSIntEnter() is always called with interrupts disabled.   解释如下:  这个函数用来通知OS我们正准备进入中断服务例程,这允许OS保持中断嵌套的路径(次数),   以便于仅在最后一次嵌套的中断退出时才执行任务调度。     1.这个函数应当在关闭中断的情况下调用,为啥?涉及到全局变量的操作了吧,也就是在调用前后加下它哥俩:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。    2.可以直接增加OSIntNesting,而不必调用这个函数,因为这个变量是全局的!    3.一定要调用OSIntExit()这个函数,即使你直接增加OSIntNesting这个变量。也就是说,上面两个函数是哥俩,一定要成对使用,但是由于大哥本质上只是增加了中断嵌套次数,可以不用大哥,但一定得用小弟,为啥?下面再细说!     后央三句自己看吧,挺简单的!   再看老二函数源码:   void  OSIntExit (void) { #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */     OS_CPU_SR  cpu_sr; #endif             if (OSRunning == TRUE) {         OS_ENTER_CRITICAL();         if (OSIntNesting 0) {                            /* Prevent OSIntNesting from wrapping       */             OSIntNesting--;         }         if ((OSIntNesting == 0) (OSLockNesting == 0)) { /* Reschedule only if all ISRs complete ... */             OSIntExitY    = OSUnMapTbl ;          /* ... and not locked.                      */             OSPrioHighRdy = (INT8U)((OSIntExitY 3) + OSUnMapTbl ]);             if (OSPrioHighRdy != OSPrioCur) {              /* No Ctx Sw if current task is highest rdy */                 OSTCBHighRdy  = OSTCBPrioTbl ;                 OSCtxSwCtr++;                              /* Keep track of the number of ctx switches */                 OSIntCtxSw();                              /* Perform interrupt level ctx switch       */             }         }         OS_EXIT_CRITICAL();     } }   源码不多,也不少,不过关键的需要理解的就那一行:OSIntCtxSw(),这是啥?中断级任务调度函数啊,终于出来了,看它的注释吧:   ********************************************************************************************************* *                                               EXIT ISR * * Description: This function is used to notify uC/OS-II that you have completed serviving an ISR.  When *              the last nested ISR has completed, uC/OS-II will call the scheduler to determine whether *              a new, high-priority task, is ready to run. * * Arguments  : none * * Returns    : none * * Notes      : 1) You MUST invoke OSIntEnter() and OSIntExit() in pair.  In other words, for every call *                 to OSIntEnter() at the beginning of the ISR you MUST have a call to OSIntExit() at the *                 end of the ISR. *              2) Rescheduling is prevented when the scheduler is locked (see OS_SchedLock())   翻译如下:这个函数用来通知OS我们已经完成了中断服务程充,当最后一次被嵌套的中断也完成时,OS将调用scheduler来决定是否有一个新的,更高优先级的任务,已经主绪。(当然没有更高的时就恢复被中断的任务)        总结:我遇到情况的主要原因大概是,当按普通方法写中断服务例程时,没有通知操作系统,触发中断时当前执行任务被中断,然后退出中断服务例程时,系统找不到原先被中断的任务,不知道该干啥,所以就进入了默认异常处理程序,死在里面出不来了,呵呵,不知道这样理解对不对,呵呵!  
相关资源
  • 所需E币: 5
    时间: 2023-2-13 21:46
    大小: 903.56KB
    上传者: czd886
    基于改进A_*算法的仓储物流移动机器人任务调度和路径优化研究
  • 所需E币: 1
    时间: 2021-3-10 20:25
    大小: 311.08KB
    上传者: czd886
    OS任务调度算法实现嵌入式数据管理
  • 所需E币: 1
    时间: 2020-5-12 22:42
    大小: 68KB
    上传者: symic
    STM32简单多任务调度
  • 所需E币: 3
    时间: 2019-12-26 10:50
    大小: 6.54KB
    上传者: wsu_w_hotmail.com
    uc/OS任务调度机制……
  • 所需E币: 5
    时间: 2019-12-25 22:49
    大小: 23KB
    上传者: rdg1993
    实时多任务操作系统(RTOS)能有效提高嵌入式平台的资源利用效率,是嵌入式应用的必然趋势。本文阐述基于MSP430F149的RTOS——M430/OS。它由汇编写成、短小精干、占用系统资源少、运行稳定可靠,目前已在思达高科配网技术公司产品上得到应用。……
  • 所需E币: 3
    时间: 2019-12-25 21:08
    大小: 39KB
    上传者: 238112554_qq
    在实时嵌入式系统中,核心处理器的能耗占据整个能耗的相当大一部分。动态电压调节被看作是降低处理器能耗的关键技术,介绍实时系统和动态电压调节的基本概念,并在CMOS器件功耗理论和实时系统下任务调度理论的基础上,提出基于混合任务集的减慢因子DVS算法。……
  • 所需E币: 3
    时间: 2019-12-25 15:21
    大小: 142.53KB
    上传者: givh79_163.com
    针对记录仪提出了一种抢占式和非抢占式的复合多任务调度策略.详细描述了任务的划分、内存管理方法、基于消息驱动机制的任务调度以及兼顾高优先级任务实时性和系统运行高效性的调度策略.……
  • 所需E币: 4
    时间: 2019-12-25 12:41
    大小: 15.03KB
    上传者: wsu_w_hotmail.com
    利用实时核的软件设计--pSOS软件设计……
  • 所需E币: 3
    时间: 2019-12-25 12:16
    大小: 572KB
    上传者: wsu_w_hotmail.com
    实时系统概念第2章实时系统概念12.0前后台系统(Foreground/BackgroundSystem)12.1代码的临界段22.2资源22.3共享资源22.4多任务22.5任务22.6任务切换(ContextSwitchorTaskSwitch)32.7内核(Kernel)32.8调度(Scheduler)42.9不可剥夺型内核(Non-PreemptiveKernel)42.10可剥夺型内核52.11可重入性(Reentrancy)52.12时间片轮番调度法72.13任务优先级72.142.14静态优先级72.15动态优先级72.16优先级反转72.17任务优先级分配82.18互斥条件102.18.1关中断和开中断102.18.2测试并置位112.18.3禁止,然后允许任务切换112.18.4信号量(Semaphores)122.19死锁(或抱死)(Deadlock(orDeadlyEmbrace))162.20同步162.21事件标志(EventFlags)182.22任务间的通讯(IntertaskCommunication)182.23消息邮箱(MessageMailboxes)182.24消息队列(MessageQueue)192.25中断202.26中断延迟202.27中断响应212.28……
  • 所需E币: 4
    时间: 2019-12-25 10:34
    大小: 830.39KB
    上传者: 2iot
    嵌入式操作系统UCOS的使用……
  • 所需E币: 4
    时间: 2019-12-25 10:32
    大小: 585KB
    上传者: 二不过三
    实时系统嵌入式系统概论第二章实时系统北京大学软件与微电子学院嵌入式系统概论实时-主要内容基本概念实时任务调度实时操作系统实时系统构建小结北京大学软件与微电子学院嵌入式系统概论实时-基本概念TermsandConceptsTypeofTimingAttributes北京大学软件与微电子学院嵌入式系统概论实时-TermsandConcepts(1)RealTimeSystemDefinitionAreal-timesystemisasystemwherethecorrectfunctioningofthesystemdependsontheresultsproducedbythesystemandthetimeatwhichtheseresultsareproduced-JaneW.S.Liu实时系统是指在确定时间内完成规定功能,并……
  • 所需E币: 3
    时间: 2019-6-7 20:07
    大小: 891.17KB
    上传者: royalark_912907664
    为了更好地解决云计算在行政管理系统任务调度交互数据量大的问题,本研究在综合遗传算法与退火算法的优点基础上提出了一种遗传退火混合算法。该算法针对行政管理系统中的任务调度数据关系特点,在云计算环境下对执行任务进行整数编码,通过遗传算法的适应度函数对任务数据进行全局最优解的搜索,任务数据的编码交叉重组过程中,利用退火算法调整适应函数的方式加快系统虚拟机对任务调度的完成时间。实验表明,该任务调度算法适应度值高于传统遗传算法且具有较强的搜索能力和收敛性。
  • 所需E币: 3
    时间: 2019-6-7 20:08
    大小: 980.29KB
    上传者: royalark_912907664
    云计算环境中的任务调度问题一直是云计算研究的重点,任务调度的目的寻找最优的任务调度策略,以高效地完成计算任务。针对云计算环境下资源规模庞大、异构性的特点,为了克服传统调度算法存在的缺点,提出一种基于改进自适应人工鱼群算法的任务调度算法。该算法以任务总执行时间作为目标函数,在迭代过程中动态自适应的调整人工鱼的视野和步长,同时对觅食行为进行改进,加快算法的收敛速度,避免算法陷入局部最优,以此提高任务调度的性能。通过在CloudSim平台进行仿真对比实验,相较于其他智能寻优算法,该算法在任务执行时间和收敛速度上都有明显的优势,是一种有效的任务调度算法。