UC/OS-II 无法屏蔽串口中断问题 1138开发板

pcaking   2009-3-4 20:55 楼主
用的是已经移植好的UCOS工程模板,在调用 OS_ENTER_CRITICAL();  进入临界段执行后,当串口发出中断时,依然转到串口中断服务函数。

难道不能屏蔽硬件中断?  

OS_ENTER_CRITICAL();        //进入临界段
      
        Disp_Imgg();  
         
OS_EXIT_CRITICAL();

此法不行,我就临时关闭串中断UARTDisable(UART1_BASE);果然在进入Disp_Imgg()时不会跳转到中断服务函数中,但是当执行Disp_Imgg()后,启用串口中断,依然保留着在执行Disp_Imgg()时间内的中断,等于延时了中断的到来,这也是想不明白的。

      
        IntDisable(UART1_BASE);    //关闭串口中断
        Disp_Imgg();
       IntEnable(UART1_BASE);   
      

//中断服务函数

void  UART1_ISR(void)
{  //OSIntEnter();
    static  unsigned short  n  =  0;
    char  c;
    char  buf[UART1_RX_MAX+1];

    UARTIntClear(UART1_BASE , UART_INT_RX | UART_INT_RT);
    c  =  UARTCharGet(UART1_BASE);

    if ( c  ==  '\r' ) {
        buf[n]  =  '\0';
        n  =  0;
         UART_Puts("THEBUF++\r\n");
        UART_Puts(buf);
        WhereID(buf);
        UART_Puts("--buzzer....\r\n");
    } else {
        if ( n  <  UART1_RX_MAX ) {
            if ( isprint(c) ) {
                buf[n++]  =  c;
                 UART_Puts("THEN++\r\n");
                 
            }
        }
    }
   
   // OSIntExit();
}



请大家帮忙解决,谢谢!

回复评论 (2)

你能确定OS_ENTER_CRITICAL()这个函数执行了,听你说来是觉得有点怪怪的。
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()可以用来保护应用程序中的临界代码;然而要特别小心,如果在调用一些如OSTimeDel()之类的功能函数之前关中断,应用程序将会死机;原因是任务被挂起一段时间,直到挂起时间到,但由于中断关掉了,时钟节拍中断一直得不到服务,显然所有的挂起类调用都有这样的问题,所以要特别小心。作为一条普遍适用的规则,调用UCOS-ii功能函数时,中断总是开着的。
点赞  2009-3-5 14:00
OS_ENTER_CRITICAL()是与体系结构相关联的代码,你需要看看它的实体,是否真正将中断关闭..
或者调试时,单步执行看看,cpsr的I位是否正确.
点赞  2009-4-2 10:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复