This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求助UCOS的Uart0中断问题(LM4F)

求助UCOS的Uart0中断问题

程序结构式:产生接收中断,根据接收的数据,再发送数据,没有发送完,在产生发送中断,将数据发送完。

1.现在我的问题是只能进入1次接收中断,不能产生发送中断,所有的任务都不执行了。
2.但是如果将OSIntExit();注销,就可以进入发送中断,所有的任务都不能执行了。

到底是什么问题呢?

 

void IntUart0(void)   //Uart0接收中断
{               
 #if OS_CRITICAL_METHOD == 3
 OS_CPU_SR  cpu_sr;
 #endif
 OS_ENTER_CRITICAL();                    
 OSIntNesting++;
 OS_EXIT_CRITICAL();

 
 ulStatus = UARTIntStatus(UART0_BASE, true);            //  读取当前中断状态
 UARTIntClear(UART0_BASE, ulStatus);                     //  清除中断状态
 
 if((ulStatus&UART_INT_RT)||(ulStatus&UART_INT_RX))//接收超时中断, 接收中断
 {
 我的程序
 }
 else if (ulStatus&UART_INT_TX)                             // 发送中断
   {
 我的程序
 } 
 else
 {
 } 
 OSIntExit();
}

  • [问题原因]

    造成这个问题的原因是由于OSIntExit函数造成的,你要分析OSIntExit()函数的源码,方便的话可以跟踪进OSIntExit()函数分析.

    OSIntExit有两个分支,一个是按原路返回出中断,另一个是返回到优先级更高的任务,从OSIntCtxSw函数中退出中断。但是从原路返回的代码是调用了OS_EXIT_CRITICAL()退出临界处理的,而从OSIntCtxSw退出中断的分支就没有调用这个函数. 当系统执行完OSIntExit()后,中断就永远处于屏蔽状态,因此就不能再进入中断了。屏蔽掉OSIntExit()函数是不可取的,那样会让系统无法进行任务切换。

    [解决方案]

    你可以在内核的程序中的OSIntExit()函数调用OSIntCtxSw()函数前增加“OS_EXIT_CRITICAL()”语句