Я разработчик встраиваемого программного обеспечения и хочу подключиться к внешнему устройству. Это устройство отправляет данные через SPI. Структура этих данных предопределена производителем внешнего устройства и не может быть отредактирована. Производитель предоставляет несколько заголовочных файлов со многими определениями типов всех данных, отправляемых через SPI.
Производитель также предлагает API для правильной обработки полученных пакетов (у меня есть доступ к источнику этого API).
Теперь к моей проблеме:
Структуры с определением типов содержат много типов данных uint8_t. К сожалению, наш MCU не поддерживает типы данных uint8_t, потому что самый маленький тип имеет ширину 16 бит (так что даже символ имеет 16 бит).
Для правильного использования API структуры должны быть заполнены данными, полученными через SPI. Поскольку входящие данные являются байтовыми пакетами, мы не можем просто скопировать эти данные в структуру, потому что наши структуры используют 16-битные для этих 8-битных типов.
В результате нам нужно выполнить много бит-операций для правильного назначения полученных данных.
ПРИМЕР: (производители 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;
Кто-нибудь может придумать легкий способ обойти эту проблему?
Я действительно не хочу писать отдельную операцию битового сдвига для каждого полученного типа пакета. (Производительность / время / пространственно-отходы)
Моя идея
(использование битовых полей для вставки 2xuint8_t в uint16_t или 4xuint8_t в 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;
Теперь я не уверен, будет ли работать это решение, поскольку порядок битов внутри битового поля не обязательно соответствует порядку в исходном файле. (или если все битовые поля имеют одинаковый размер?)
Надеюсь, я достаточно хорошо описал проблему, чтобы вы ее поняли.
Спасибо и всего наилучшего.