Прежде чем задать любой вопрос: я имею дело с реальным оборудованием.
Я ищу метаязык, который позволил бы мне указать содержимое структуры данных, где поля имеют разную битовую длину (это включает в себя поля, такие как 1, 3, 24 или 48 бит), в отношении порядка байтов, и генерировать доступ к коду C ++ данные.
Вопрос был отложен из-за его слишком расплывчатого характера, поэтому я постараюсь сделать его как можно более ясным:
Я ищу язык, который:
ASN.1 звучит почти хорошо для этой цели, но добавляет свои собственные издержки (то есть я не могу создать простую структуру, в которой 2 байта разбиты на 4 куска) — я ищу язык, который бы предлагал точный представление структуры.
Например, я хотел бы абстрагироваться от этого:
struct Command {
struct Record {
int8_t track;
int8_t point;
int8_t index;
int16_t start_position; // big endian, misaligned
int32_t length; // big endian, misaligned;
} __attribute__((packed)); // structure length = 11 bytes.
int8_t current : 1;
int8_t command : 7;
int8_t reserved;
int16_t side : 3; // entire int16_t needs to be
int16_t layer : 3; // converted from big endian, because
int16_t laser_mark : 3; // this field spans across bytes.
int16_t laser_power : 3;
int16_t reserved_pad : 2;
int16_t laser_tag : 2;
int32_t mode_number : 8; // again, entire 32 bit field needs to be converted
int32_t record_count : 24; // from big endian to read this count properly.
Record records[];
} __attribute__((packed));
вышеперечисленное должно быть упаковано точно в структуру, несущую 8 + record_count * 11
байты, все сформировано точно, никаких дополнительных данных, никаких дополнительных битов или байтов не установлено.
Выше просто пример. это сделано просто, чтобы я не забивал сайт фактическими структурами, которые часто имеют сотни полей. Это было упрощенный, но показывает многие функции, которые я с нетерпением жду (две оставшиеся функции — это 48- или 64-разрядные целые числа и простые данные (bytes []))
Если этот вопрос все еще слишком расплывчатый, пожалуйста, объясните, что я должен добавить в комментариях. Спасибо!
Простая таблица, которая отслеживает размеры отдельных полей и используется для выделения смещений каждого элемента в вашей структуре, звучит как самое простое решение. Это не масштабируется до глубоко вложенных структур, но может быть настроено для поддержки обработки неназначенных битовых случаев, которые вы идентифицируете.
Затем вы можете использовать это для генерации констант или даже именованных методов доступа к свойствам для извлечения и обновления отдельных полей. Учитывая размер отдельных элементов, макросы, вероятно, сделают жизнь еще сложнее, но любой основной компилятор должен встроить код. Ваш пробег может варьироваться в зависимости от реализации на основе шаблонов.
Если бы помогло, если бы вы могли использовать общее представление для обеих сторон приложения (хоста и устройства), чтобы еще больше снизить вероятность ошибок транскрипции.
В мире ПЛК существует множество различных механизмов компоновки, но все они очень встроены в свои экосистемы и поэтому не очень помогут.
С другой стороны, если у вас есть доступный инструментарий, вы можете рассмотреть что-то вроде структуры ASN.1 для представления. В крайнем случае, вы даже можете использовать генератор с открытым исходным кодом, чтобы создать генератор без кодирования непосредственно из MIB.