【第22期】观点:IT 行业加班,到底有没有价值?

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()简直是不可忍受的,因为开销太大,大大地影响模拟串口的波特率。


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

相关文章推荐

系统移植

今天突然有个想法,是否在其他结构比较简单的平台上移植比较容易一点,正好同学有一个凌阳的精简板,反正今天是星期天,就当是休息了。 首先肯定是去熟悉SPCE061A的结构和IDE了。主要是存储器结构、指...

【读书笔记】usOS-II学习笔记(2008-11-4)

2008-11-4 ucOS-II的中断处理

uCOS2中的中断处理过程

 简要目录: 一、uCOS2中的中断处理过程。 二、在一指的情况下,要注意的问题。 三、在一指的情况下,代码可能的执行路径。 四、贴一些网上还好的关于ucos中断处理的帖子。   (...
  • ruan_6
  • ruan_6
  • 2014-03-28 19:57
  • 1541

uCOS-II移值过程实例讲解

uCOS-II移值过程实例讲解 我将uCOS-II 移植到了EPONS 的C33209的平台上,接下来我就基于我移植好的代码讲解如何将uCOS-II从一种MCU移植到另一种MCU。 首先介绍uCOS-II的文件,如下表: ucos_ii.h os_cfg.h os_cpu.h os_core.c os_dbg_r.c os_flag.c os_mbox.c os_mem.c os_mutex.c

ucos在M3中的中断嵌套机制

M3的中断控制器特性 可嵌套中断支持的作用范围很广,覆盖了所有的外部中断和绝大多数系统异常。外在表现是,这些异常都可以被赋予不同的优先级。当前优先级被存储在xPSR的专用字段中。当一个异常发生时...

转载一篇写得不错的UCOS-II移植文章

今天突然有个想法,是否在其他结构比较简单的平台上移植比较容易一点,正好同学有一个凌阳的精简板,反正今天是星期天,就当是休息了。 首先肯定是去熟悉SPCE061A的结构和IDE了。主要是存储器结构、指令系统和中断这几个部分。本来不是做这个的,没有必要深究,总体看看,知道在哪些地方查就行,所以看到很快。于是摆好uCOS系统的资料,按照移植步骤,一个个文件、函数地写好

uCOS2中的中断处理过程

uCOS2中的中断处理过程 --- 要相当小心458451054152011-1-10 0:19:31    收藏  |  打印  | 投票(1)  |  评论(0)  |  阅读(10218) ...

在51系列单片机上移植uCOS-II

<td id="fontzoom" style="border-right: #8cc3de 1pt solid; padding-right: 6pt; border-top: #8cc3de 1pt solid; padding-left: 6pt; padding-bott

uCOS51移植心得

前一段时间,我参与了一个SNMP网管板的项目,我负责硬件设计和单板软件开发。该板的硬件由MCS51+RTL8019AS组成,有64K FLASH 和64K SRAM。软件部分有操作系统和TCPIP协议栈。硬件比较简单,用了一个月就搞定了,协议栈我参考了老古开发板的部分程序又上网找了SNMP源代码也很快完成了,但是测试时发现当使用较低时钟频率的CPU时(为了降低成本),由于ASN.1编解码部分过于庞大,而我的程序又是一个大循环,AGENT的响应速度受到严重影响,用户界面也反应迟钝。更坏的消息是公司为了适应市场需求,还要在上面跑PPP和HTTP。那样的话,我就得用40

整理uc/os的46个函数

Void OSInit(void); 所属文件 OS_CORE.C     调用者 启动代码    开关量 无 OSinit()初始化μC/OS-Ⅱ,对这个函数的调用必须在调用OSStart()函数之...
  • softn
  • softn
  • 2016-07-13 09:26
  • 453
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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