Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Dummy değişkeni ?

Başlatan armsistem, 07 Haziran 2013, 21:58:39

armsistem

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 */
}

mufitsozen

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
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

armsistem

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.

SpeedyX

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.

armsistem

yanıtlar için çok teşekkürler