OSIntEnter() 与 OSIntExit()

原创 2016年08月29日 09:38:33

 在uC/OS-II中,通常在进入中断时需要使用OSIntEnter() ;退出中断前使用OSIntExit();

分析一下OSIntEnter() 的代码

<span style="font-size:18px;">void  OSIntEnter (void)
{
    if (OSRunning == OS_TRUE) {
        if (OSIntNesting < 255u) {
            OSIntNesting++;                      /* Increment ISR nesting level                        */
        }
    }
}</span>
这个函数的作用是对全局变量OSIntNesting增1,OSIntNesting为中断嵌套深度。

再看看OSIntExit()

void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    if (OSRunning == OS_TRUE) {
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0u) {                           /* Prevent OSIntNesting from wrapping       */
            OSIntNesting--;
        }
        if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */
            if (OSLockNesting == 0u) {                     /* ... and not locked.                      */
                OS_SchedNew();
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
                    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();
    }
}

函数的前面部分对OSIntNesting减1,刚好与OSIntEnter() 相对应;后面部分则进行任务调度。

由此可知,在中断服务函数中使用这对函数,乃是为了在中断结束后可进行任务调度,使得系统更加“实时”。假如中断服务函数里没有进行任何的与任务有关操作,而且时间比较短,是没必要使用这对函数的。譬如,我们使用定时器模拟串口发送,中断服务函数里只是进行IO口的翻转,这个时候加入OSIntExit()简直是不可忍受的,因为开销太大,大大地影响模拟串口的波特率。


版权声明:本文为博主原创文章,未经博主允许不得转载。

uCOS-III中的OS_CRITICAL_ENTER()和OS_CRITICAL_EXIT()使用

uCOS-III是uCOS-II的升级版本,虽然针对于后者有各种优化,但是有一点不是特别好,就是有些宏定义名称会做一些修改,这种修改可能更合理,但是可能会引起一些不必要的“误会 ”,例如在uCOS-I...

uC\OS-II OSintExit函数的一个bug

每次进入中断后,系统都会出现无法进行任务切换和进入内核时钟中断的问题,这似乎是总中断被屏蔽了的现象。通过对程序的跟踪发现是内核函数OSIntExit函数导致的。 OSIntExit函数代码如下: ...

银联IC卡读卡流程详解--读卡器与卡交互指令

测试使用的卡是招商银行的IC卡: (一)应用选择         一张银联IC卡里面可能有多个应用,所谓应用就是卡片和终端之间的应用协议和相关的数据集,读卡器和卡的交互其实就是和应用的交互...

进程的通信方式及特点

进程通信的含义 进程是转入内存并准备执行的程序,每个程序都有私有的虚拟地址空间,由代码,数据以及它可利用的系统资源(如文件,管道)组成.多进程/多线程是windows操作系统的一个基本特征.Linu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSIntEnter() 与 OSIntExit()
举报原因:
原因补充:

(最多只允许输入30个字)