Registre el mapa usando C para un extremo delantero analógico MAX30001

1

Estoy tratando de seguir las mejores prácticas en el mapeo de registros. Tengo un front-end analógico MAX30001 para aplicaciones de ECG ( Hoja de datos ) y en la página 38, hay una tabla que contiene el comando de usuario y el mapa de registro: 32 palabras, cada una con 24 bits de información. ¿Debo usar estructuras o macros?

Usando estructuras con campos de bits:

typedef struct {

    volatile uint8_t Bit0 : 1;
    volatile uint8_t Bit1 : 1;
    volatile uint8_t Bit2 : 1;
    volatile uint8_t Bit3 : 1;
    // ... 
    // and so on
    // ... 
    volatile uint8_t Bit23 : 1;
} foo;

Usando macros:

#define STATUS (*(volatile uint32_t*)0x01))
    
pregunta Pryda

2 respuestas

2

En el caso general, donde tiene registros asignados a la memoria, siempre debe evitar las estructuras de campo de bits. Esto se debe a que están muy mal especificados por el estándar C. Las cosas fundamentales que puedes asumir están especificadas, no lo están. Esto incluye orden de bits, orden de bytes, relleno y amp; alineación.

Además, uint8_t entre otros tipos, ¡ni siquiera es un tipo permitido en los campos de bits! Solo puedes usar los tipos int , aunque si int cuenta como firmado o sin firmar tampoco se especifica ...

Para resumir, los campos de bits son terriblemente poco confiables y queda a la merced de la implementación del compilador (si existe) cuando los usa.

Lo que debe hacer en su lugar, es usar siempre macros de dirección y máscara de bits, junto con los operadores de bit a bit. Son 100% bien definidos y portátiles.

    
respondido por el Lundin
1

El MAX30001 utiliza una interfaz SPI. No es un dispositivo asignado en memoria, por lo que aquí no se pueden utilizar estructuras ni macros.

Todo lo que puedes hacer útilmente es definir un grupo de macros para representar los números de registro y los bits individuales dentro de ellos, por ejemplo:

#define MAX30001_NO_OP           0x00
#define MAX30001_STATUS          0x01
#define MAX30001_STATUS_EINT     0x800000
#define MAX30001_STATUS_EOVF     0x400000
#define MAX30001_STATUS_FSTINT   0x200000
// etc

Incluso para dispositivos mapeados en memoria, generalmente es mejor evitar los campos de bits (como Bit0:1 ). Los compiladores de C a menudo los manejan mal, y ofrecen pocas garantías sobre cómo se agruparán los campos de bits en una estructura. Utilice macros para representar bits individuales dentro de un solo registro.

    
respondido por el duskwuff

Lea otras preguntas en las etiquetas