struturas com uint8_t em um MCU sem tipo de dados uint8

Sou desenvolvedor de software incorporado e quero fazer interface com um dispositivo externo. Este dispositivo envia dados via SPI. A estrutura desses dados é predefinida pelo fabricante do dispositivo externo e não pode ser editada. O fabricante está fornecendo alguns arquivos de cabeçalho com muitos typedefs de todos os dados enviados via SPI. O fabricante também oferece uma API para manipular os pacotes recebidos da maneira correta (eu tenho acesso à fonte dessa API

Agora, para o meu problema: As estruturas digitadas contêm muitos tipos de dados uint8_t. Infelizmente, nosso MCU não suporta tipos de dados uint8_t, porque o menor tipo tem 16 bits de largura (portanto, mesmo um caractere possui 16 bits

Para usar a API corretamente, as estruturas devem ser preenchidas com os dados recebidos via SPI. Como os dados recebidos são pacotes de bytes, não podemos simplesmente copiar esses dados na estrutura, porque nossas estruturas usam 16 bits para esses tipos de 8 bits. Como resultado, precisamos executar muitas operações de deslocamento de bits para atribuir os dados recebidos corretament

EXEMPLO (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;

Alguém pode pensar em uma solução fácil para esse problema? Eu realmente não quero escrever uma operação de deslocamento de bits separada para cada tipo de pacote recebido. (desempenho / tempo / desperdício de espaço)

Minha idei (usando campos de bits para inserir 2xuint8_t em uint16_t ou 4xuint8_t em 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;

Agora não tenho certeza se esta solução vai funcionar, pois a ordem dos bits dentro do campo de bits não é necessariamente a ordem no arquivo de origem. (ou será que todos os campos de bits têm o mesmo tamanho?)

Espero ter descrito o problema suficientemente bem para você entende

brigado e cumprimento

questionAnswers(3)

yourAnswerToTheQuestion