Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: armsistem - 07 Haziran 2013, 21:58:39

Başlık: Dummy değişkeni ?
Gönderen: armsistem - 07 Haziran 2013, 21:58:39
Arkadaşlar merhaba ,

Aşağıda kullanılan Dummy değişkeni tam olarak ne işe yarıyor , mantığını çözemedim. RX okuyor interrupt mı siliyor." Dummy read on RX to clear interrupt, then bail out" kullanmasam ne olur ? U0RBR okutulduğunda mı sıfırlanıyor ?




void UART0Handler (void) __irq
{
  BYTE IIRValue, LSRValue;
  BYTE Dummy = Dummy;

  IENABLE;      /* handles nested interrupt */
  IIRValue = U0IIR;

  IIRValue >>= 1; /* skip pending bit in IIR */
  IIRValue &= 0x07; /* check bit 1~3, interrupt identification */
  if ( IIRValue == IIR_RLS ) /* Receive Line Status */
  {
  LSRValue = U0LSR;
  /* Receive Line Status */
  if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
  {
    /* There are errors or break interrupt */
    /* Read LSR will clear the interrupt */
    UART0Status = LSRValue;
    Dummy = U0RBR; /* Dummy read on RX to clear
             interrupt, then bail out */
    IDISABLE;
    VICVectAddr = 0; /* Acknowledge Interrupt */
    return;
  }
  if(LSRValue & LSR_RDR)/* Receive Data Ready */
  {
    /* If no error on RLS, normal ready, save into the data buffer. */
    /* Note: read RBR will clear the interrupt */
    UART0Buffer[UART0Count] = U0RBR;
    UART0Count++;
    if(UART0Count == BUFSIZE)
    {
    UART0Count = 0; /* buffer overflow */
    }
  }
  }
  else if ( IIRValue == IIR_RDA ) /* Receive Data Available */
  {
  /* Receive Data Available */
  UART0Buffer[UART0Count] = U0RBR;
  UART0Count++;
  if ( UART0Count == BUFSIZE )
  {
    UART0Count = 0; /* buffer overflow */
  }
  }
  else if ( IIRValue == IIR_CTI ) /* Character timeout indicator */
  {
  /* Character Time-out indicator */
  UART0Status |= 0x100; /* Bit 9 as the CTI error */
  }
  else if ( IIRValue == IIR_THRE ) /* THRE, transmit holding register empty */
  {
  /* THRE interrupt */
  LSRValue = U0LSR; /* Check status in the LSR to see if
             valid data in U0THR or not */
  if ( LSRValue & LSR_THRE )
  {
    UART0TxEmpty = 1;
  }
  else
  {
    UART0TxEmpty = 0;
  }
  }
   
  IDISABLE;
  VICVectAddr = 0; /* Acknowledge Interrupt */
}
Başlık: Ynt: Dummy değişkeni ?
Gönderen: mufitsozen - 07 Haziran 2013, 22:19:32
Eger ISRa error yada break'den dolayi girmis ise int flag sifilamak icin bir dummy read yapmak lazim yoksa int flag reset olmaz ve geri doner donmez int yeniden olusur boylece sonsuz loop olur
Başlık: Ynt: Dummy değişkeni ?
Gönderen: armsistem - 07 Haziran 2013, 23:40:28
Alıntı yapılan: mufitsozen - 07 Haziran 2013, 22:19:32
Eger ISRa error yada break'den dolayi girmis ise int flag sifilamak icin bir dummy read yapmak lazim yoksa int flag reset olmaz ve geri doner donmez int yeniden olusur boylece sonsuz loop olur

Hocam ; dummy = u0rbr ; -- > yaptığımızda buffer mı temizleniyor.
Başlık: Ynt: Dummy değişkeni ?
Gönderen: SpeedyX - 08 Haziran 2013, 00:09:02
Kodlar LPC2xxx ARM7 işlemciye ait. Eğer uart rx sırasında frame error, overrun error gibi bir hata oluşmuşsa bufferdaki veri bir işe yaramaz, buffer ı temizlemek (yani bu hata flaglarını temizlemek) için bir okuma gerçekleştiriyoruz.
Başlık: Ynt: Dummy değişkeni ?
Gönderen: armsistem - 08 Haziran 2013, 09:27:52
yanıtlar için çok teşekkürler