码迷,mamicode.com
首页 > 其他好文 > 详细

ucos2.86的任务调度漏洞

时间:2015-03-10 01:25:58      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

  Ucos2.86版本有一个任务调度的漏洞,该漏洞在2.88之后的版本已经修改过来了,今天我们来看看这个漏洞, 漏洞在官方2.88的文档中如下

 

    这两个函数都是调度器函数,也就是说调度器有漏洞,但是看官方文档的说明,只有cortex-m3有这个bug,那我们就将2.88的代码和2.91的代码对比看看改变了哪些

2.86中的代码是这样的:

void  OS_Sched (void)

{

#if OS_CRITICAL_METHOD == 3                          

    OS_CPU_SR  cpu_sr = 0;

#endif

    OS_ENTER_CRITICAL();

    if (OSIntNesting == 0) {                          

        if (OSLockNesting == 0) {                     

            OS_SchedNew();

            if (OSPrioHighRdy != OSPrioCur) {         

                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

#if OS_TASK_PROFILE_EN > 0

                OSTCBHighRdy->OSTCBCtxSwCtr++;        

#endif

                OSCtxSwCtr++;                          

                OS_TASK_SW();                         

            }

        }

    }

    OS_EXIT_CRITICAL();

}

    到了2.91中,代码变成了这样

void  OS_Sched (void)

{

#if OS_CRITICAL_METHOD == 3u                          

OS_CPU_SR  cpu_sr = 0u;

#endif

 

OS_ENTER_CRITICAL();

if (OSIntNesting == 0u) {                         

    if (OSLockNesting == 0u) {                    

       OS_SchedNew();

       OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

       if (OSPrioHighRdy != OSPrioCur) {         

#if OS_TASK_PROFILE_EN > 0u

           OSTCBHighRdy->OSTCBCtxSwCtr++;        

#endif

           OSCtxSwCtr++;                        

           OS_TASK_SW();                        

       }

    }

}

OS_EXIT_CRITICAL();

}

 

    通过比较我们发现,代码中仅仅做了一件事情,将

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

    放在了比较任务优先级的动作的前面,那这样的修改是为什么呢?官方的解释是之前的代码会造成高优先级任务无法切换,低优先级长期占有cpu,最后导致整个程序只有空闲任务还在运行.

至于造成这个中断的具体原因,我个人觉得这和cortex-m3的晚到中断和咬尾中断特性有关系,但是具体关系也还没想明白,直觉….容我三思  

ucos2.86的任务调度漏洞

标签:

原文地址:http://www.cnblogs.com/dengxiaojun/p/4324922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!