打印
[ZLG-ARM]

请教关于uart0问题?

[复制链接]
1437|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
njgwx|  楼主 | 2008-5-15 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   不太理解uart0.c中的UART0Getch(void)函数。
   uint8 UART0Getch(void)
{
    uint8 err;

    OS_ENTER_CRITICAL();   //关闭中断
    while ((U0LSR & 0x00000001) == 0)
    {                                           
        U0IER = U0IER | 0x01;                   
        OSSemPend(Uart0Sem, 0, &err);           
    }
    err = U0RBR;                              
    OS_EXIT_CRITICAL();    //打开中断
    return err;
}

OS_ENTER_CRITICAL() 这条语句是关闭中断意思,如果这时还没接收到数据,又怎么能进入中断接收到中断发送信号量呢?

相关帖子

沙发
zlgarm| | 2008-5-17 12:28 | 只看该作者

njgwx 你好

njgwx 你好
   其实这儿使用的是查询方式接收数据,判断到有数据时发送信号量。
 on duty : liuyanlong

使用特权

评论回复
板凳
njgwx|  楼主 | 2008-5-19 23:11 | 只看该作者

zlgarm 你好

  zlgarm 你好:

    uint8 UART0Getch(void)
       {
         uint8 err;
         OS_ENTER_CRITICAL();
         while ((U0LSR & 0x00000001) == 0)
           {                                           /* 没有收到数据 */
             U0IER = U0IER | 0x01;                   /* 允许接收中断 */
             OSSemPend(Uart0Sem, 0, &err);           /* 等待接收数据 */
           }
         err = U0RBR;                                /* 读取收到的数据 */
         OS_EXIT_CRITICAL();
          return err;
      } 
      
 void UART0_Exception(void)
{
    uint8 IIR, temp;
    OS_ENTER_CRITICAL();
    while(((IIR=U0IIR) & 0x01) == 0)
   {                                                // 有中断未处理完
        switch (IIR & 0x0f)
        {                
            case 0x04:                                  // 接收数据可用
                OSSemPost(Uart0Sem);                    /* 通知接收任务 */
                U0IER &= (~0x01);                       // 禁止接收及字符超时中断
                break;
                     
            case 0x06:                                  // 接收线状态
                temp = U0LSR;
                break;
                
            case 0x0c:                                  // 字符超时指示
                OSSemPost(Uart0Sem);                    /* 通知接收任务 */
                U0IER &= (~0x01);                       // 禁止接收及字符超时中断
                break;
                
            default:
                break;
        }
    } 
    VICVectAddr = 0;              // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
}
      
         我其实我知道UART0Getch(void)使用查询方式接收数据,但我搞不懂
 UART0Getch(void)开始用OS_ENTER_CRITICAL()关闭中断,如果有数据来了,进 入不了中断,又怎么能给UART0Getch(void)发信号量呢,是不是无限等待下去呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

2

粉丝