3223|2

7

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请打大牛们指导一下,ucos的中断处理是不是有问题? [复制链接]

 ucos ii 的中断处理过程是这样的(直接上代码):
{
     OSIntEnter();

    //Call ISR...

    OSIntExit ();

    return;
}

OSIntExit ()
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0;
#endif
    if (OSRunning == OS_TRUE) {
        OS_ENTER_CRITICAL();//关中断
        if (OSIntNesting > 0) {                            /* Prevent OSIntNesting from wrapping       */
            OSIntNesting--;
        }
        if (OSIntNesting == 0) {                           /* Reschedule only if all ISRs complete ... */
            if (OSLockNesting == 0) {                      /* ... and not locked.                      */
                OS_SchedNew();
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
                    OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
#if OS_TASK_PROFILE_EN > 0
                    OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
#endif
                    OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
                    OSIntCtxSw();                          /* Perform interrupt level ctx switch       */
                }
            }
        }
        OS_EXIT_CRITICAL();//开中断
    }
}
OSIntCtxSw:

# Call OSTaskSwHook
    bl        OSTaskSwHook

#  Get pointer to ready task TCB
    lis        r11,OSTCBHighRdyPtr@ha
    lwz        r11,OSTCBHighRdyPtr@l(r11)

#  Save as current task TCB ptr.
    lis        r12,OSTCBCurPtr@ha
    stw        r11,OSTCBCurPtr@l(r12)

# Get High Ready Priority
    lis        r12,OSPrioHighRdy@ha
    lbz        r10,OSPrioHighRdy@l(r12)

# Save as Current Priority
    lis        r12,OSPrioCur@ha
    stb        r10,OSPrioCur@l(r12)

#  Get new stack pointer
    lwz        r1,0(r11)

# Restore context
    IntEpilogue  #出栈

    .end


在函数OSIntExit ()中,先关中断,然后调用函数OSIntCtxSw()进行任务切换,最后开中断。但是在执行函数OSIntCtxSw()后,系统将执行优先级最高的 任务,不会再回到函数OSIntExit()中区执行OS_EXIT_CRITICAL()开中断。这样就会造成一种错误,只关了中断却没有开中断。

我研究ucos ii内核没多久,以上只是我的一些想法,请给位大牛批评指正。

最新回复

说一点自己的见解。 进入OSIntExit 后,关中断,然后调用OSIntCtxSw()进行任务切换,这时候并不会立即执行准备好的任务,只是把堆栈指针指向了需要切换的任务,当执行完OS_EXIT_CRITICAL()之后,返回的时候,从堆栈里面吧将要运行的任务的现场进行还原,就可以运行新的任务了。  详情 回复 发表于 2011-10-9 19:56
点赞 关注
 

回复
举报

9

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
说一点自己的见解。
进入OSIntExit 后,关中断,然后调用OSIntCtxSw()进行任务切换,这时候并不会立即执行准备好的任务,只是把堆栈指针指向了需要切换的任务,当执行完OS_EXIT_CRITICAL()之后,返回的时候,从堆栈里面吧将要运行的任务的现场进行还原,就可以运行新的任务了。
 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 beimenxue 的帖子

你说的应该不对,在调用OSIntCtxSw()后,出栈,指令寄存器就指向了优先级最高的就绪任务,下一步就是去执行这个任务,不会有返回。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表