首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在ucos中开中断

在ucos中开中断

在ucos中的中断打开与在没有操作系统的条件下有很大的区别,我们需要在irq.s中,main函数中修改几处地方,另外需要注意的是:因为操作系统已经占用了定时器0和中断的通道0所以我们在使用的时候应该避开与之产生冲突,否则将导致系统崩溃。完整的程序还没有调试好,但是刚才已经出了中断了只是串口返回的数据还不对,还要据需调试。
  下面是从网上搜到的一部分程序,关键的部分都已经列出,注意仔细检查,记住,很重要。
  
  
  
  zlg那本书上都有写.
  ------------
  irq.sfile end)
  UART0_Handler   HANDLER UART0_Exception
  ------------
  target.c:
  void VICInit(void)
  {
      extern void IRQ_Handler(void);
      extern void Timer0_Handler(void);
      extern void UART0_Handler(void);
      VICIntEnClr  = 0xffffffff;
      VICIntSelect = 0;
      VICDefVectAddr = (uint32)IRQ_Handler;     // Nun-Vect Interrupt address.
      VICVectAddr0 = (uint32)Timer0_Handler;
      VICVectCntl0 = (0x20 | 0x04);
  
      VICVectAddr1 = (uint32)UART0_Handler;
      VICVectCntl1 = (0x20 | 0x06);
  
      VICIntEnable = (1 << 4) |
                     (1 << 6);
  }
  ------------------
  main.c
  U0IER &= ~0X01;
  U0IER |= 0X01;
  开关中断.
  isp:
  void  UART0_Exception(void)
  {
     uint8  IIR, i;
     OS_ENTER_CRITICAL();   
  
     while(((IIR = U0IIR) & 0x01) == 0 )        
     {
        SWITCH (IIR & 0x0e)
        {
           case 0x02:        
                                                       // Tx Interrupt
              if ( (uint8)TXOUT % BUFFER_LENGTH !=
                   (uint8)TXIN  % BUFFER_LENGTH )
                 U0THR = Uart0TxBuf[(uint8)(TXOUT++)%BUFFER_LENGTH];           
              else   U0IER &= ~0x02;
  
              break;
  
  
  
           case 0x04:                                  // Rx Interrupt            
              /* buffer the data */
              Uart0RxBuf[(uint8)(RXIN++)%BUFFER_LENGTH] =  U0RBR;
  
              /* find the keyword */
              for (i=KEYWORD_LENGTH; i; i--)
              {
                 if (Uart0RxBuf[(uint8)(RXIN-i)%BUFFER_LENGTH] !=
                     KEYWORD[KEYWORD_LENGTH-i])
                    break;
              }
              if (!i)   OSSemPost(SemUart0);
  
              /* queue full */            
              if ((uint8)RXIN%BUFFER_LENGTH == (uint8)RXOUT%BUFFER_LENGTH)
              {
  
              #if UART0_RXBUF_OVERFLOW_EN == 1               
                 RXIN--;
              #endif               
  
                 OSSemPost(SemUart0);
              }
  
              break;
  
  
  
           case 0x06:
  
              break;
  
           case 0x0c:
  
              break;
  
           default:   
  
              break;         
        }
     }
  
     VICVectAddr = 0;
     OS_EXIT_CRITICAL();
  }
继承事业,薪火相传
返回列表