jlinkv8 发表于 2011-8-4 19:59

关于ZLG UCOS中间件的UART函数请教

LPCX2131模板提供了 许多UCOS中间件,其中有UART的代码,以下不明白,请指教下:
void UART1_Exception( void )
{
uint8tIIR,temp,i;

OS_ENTER_CRITICAL();
    while( ((tIIR = U1IIR)&0x01) == 0)// 有中断未处理完,读取UIIR清除中断
    {                                                   
   switch (tIIR & 0x0E)
   {
            case 0x02:                     // THRE中断
                for (i = 0; i < UART1_FIFO_LENGTH; i++) // 向发送FIFO填充数据
                {
                         if (QueueRead(&temp, UART1SendBuf) == QUEUE_OK)
                         {
                            U1THR = temp;
                        }
                        else
                         {
                           U1IER = U1IER & (~0x02);   // 队列空,则禁止发送中断
                     
                     
                         }
                     }
                break;
.......
假设发送8个字符,而UART1_FIFO_LENGTH长度为16,那么去掉进入中断前发送掉的一个字符外,还有7个(先写入队列)在发送中断函数里面发送,for循环到第7次时候,队列已经读空,这个时候关闭中断。但是因为for循环终止于16,所以还要循环读8次,那么这8次都没有数据,重复在此浪费时间吗?不知道这个代码这样设计的目的是什么?求解。

john_lee 发表于 2011-8-7 10:54

应该在U1IER = U1IER & (~0x02); 下面加一个break;
页: [1]
查看完整版本: 关于ZLG UCOS中间件的UART函数请教