while (! (UCSRA & (1RXC))) vs while (RXC == 0)

1

Tengo una pregunta sobre el código a continuación:

    unsigned char USART_Recieve(void)
    {
        /* Wait for data to be received*/
        while ( !(UCSRA &  (1<<RXC)));
        /* Get and return received data from buffer*/
        return UDR;
    }

¿Por qué simplemente no escribimos

    while (RXC == 0); 

¿Cuándo queremos esperar hasta que se termine la recepción de datos? y cual es la diferencia ¿Y cómo el primer tiempo espera hasta que se termine de recibir?

He buscado la misma pregunta pero no pude encontrar ninguna. Por favor, dígame el enlace.

Gracias.

    
pregunta Linosa

1 respuesta

8
  

¿Por qué simplemente no escribimos?       while (RXC == 0);

Porque "RXC" es una constante 7. ¿Cuál es el número del bit RXC en el registro UCSRA? Entonces, mientras () saldrá inmediatamente, porque se expandirá a while (7 == 0);

Tenga en cuenta que le he dado un ejemplo para ATmega32. Para diferentes controladores, la macro "RCX" puede tener un valor diferente.

Y en caso de que se esté preguntando, "UCSRA" y "UDR" en su código también son dos definiciones de macro que hacen referencia a otra macro, _SFR_IO8.

ACTUALIZACIÓN

Por ejemplo, las macros:

#define RXC     7
#define UCSRA   _SFR_IO8(0x0B)

transforme el código while (!(UCSRA & (1<<RXC))); en

while (!(_SFR_IO8(0x0B) & 0x80));

Entonces la macro

#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + __SFR_OFFSET)

transforma el código más adelante en

while (!(_MMIO_BYTE((0x0B) + __SFR_OFFSET) & 0x80));

Dado que _MMIO_BYTE y __SFR_OFFSET también son macros, el proceso continúa hasta que se procesan todas las directivas de macros. Al final te consigues un código que lee. UCSRA registra y aplica la máscara para el bit # 7 en él.

La razón principal de todo esto es hacer que el código sea más portátil. Por ejemplo, al cambiar 0x0B en la macro UCSRA podemos acceder a los registros de UCSRA en diferentes controladores sin cambiar la dirección de registro en nuestro código.

    
respondido por el Maple

Lea otras preguntas en las etiquetas