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