estructuras con uint8_t en una MCU sin tipo de datos uint8_t

Soy desarrollador de software incorporado y quiero interactuar con un dispositivo externo. Este dispositivo envía datos a través de SPI. La estructura de esos datos está predefinida por el fabricante del dispositivo externo y no se puede editar. El fabricante proporciona algunos archivos de encabezado con muchas definiciones de tipo de todos los datos enviados a través de SPI. El fabricante también ofrece una API para manejar los paquetes recibidos de la manera correcta (tengo acceso a la fuente de esa API).

Ahora mi problema: las estructuras typedefed contienen muchos tipos de datos uint8_t. Desafortunadamente, nuestra MCU no admite los tipos de datos uint8_t, porque el tipo más pequeño tiene 16 bits de ancho (por lo que incluso un carácter tiene 16 bits).

Para usar la API correctamente, las estructuras deben rellenarse con los datos recibidos a través de SPI. Dado que los datos entrantes son paquetes de bytes, no podemos simplemente copiar estos datos en la estructura, porque nuestras estructuras usan 16 bits para esos tipos de 8 bits. Como resultado, necesitamos realizar muchas operaciones de desplazamiento de bits para asignar los datos recibidos correctamente.

EJEMPLO (fabricantes typedef struct)

typedef struct NETX_COMMUNICATION_CHANNEL_INFOtag
{
  uint8_t   bChannelType;              //uint16_t in our system
  uint8_t   bChannelId;                //uint16_t in our system
  uint8_t   bSizePositionOfHandshake;  //uint16_t in our system
  uint8_t   bNumberOfBlocks;           //uint16_t in our system
  uint32_t  ulSizeOfChannel;           
  uint16_t  usCommunicationClass;      
  uint16_t  usProtocolClass;           
  uint16_t  usProtocolConformanceClass;
  uint8_t   abReserved[2];             //uint16_t in our system
} NETX_COMMUNICATION_CHANNEL_INFO;

¿Alguien puede pensar en una solución fácil a este problema? Realmente no quiero escribir una operación de desplazamiento de bits separada para cada tipo de paquete recibido. (rendimiento / tiempo / desperdicio de espacio)

Mi ide (usando bitfields para rellenar 2xuint8_t en uint16_t o 4xuint8_t en uint32_t)

typedef struct NETX_COMMUNICATION_CHANNEL_INFOtag
{
  struct packet_uint8{
    uint32_t  bChannelType              :8;
    uint32_t  bChannelId                :8;
    uint32_t  bSizePositionOfHandshake  :8;
    uint32_t  bNumberOfBlocks           :8;
  }packet_uint8;
  uint32_t  ulSizeOfChannel;               
  uint16_t  usCommunicationClass;          
  uint16_t  usProtocolClass;               
  uint16_t  usProtocolConformanceClass;    
  uint16_t  abReserved;                    
} NETX_COMMUNICATION_CHANNEL_INFO;

Ahora no estoy seguro de si esta solución va a funcionar ya que el orden de los bits dentro del campo de bits no es necesariamente el orden en el archivo de origen. (¿o es si todos los campos de bits tienen el mismo tamaño?)

Espero haber descrito el problema lo suficientemente bien como para que lo entiendas.

Gracias y saludos

Respuestas a la pregunta(3)

Su respuesta a la pregunta