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中断问题
程序结构式:产生接收中断,根据接收的数据,再发送数据,没有发送完,在产生发送中断,将数据发送完。
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()”语句