Переключение между упакованными / неупакованными структурами
У меня есть много данных конфигурации в EEPROM (4 КБ), которые я считываю в упакованных структурах. Во время моей прошивки мне нужно очень часто читать / изменять эти значения, а производительность упакованных структур не оптимальна, поэтому у меня есть вторая структура, которая точно такая же, только не упакованная. Я должен копировать каждое значение одно за другим из упакованной структуры в распакованную, что подвержено ошибкам, потому что, когда я добавляю значение в упакованную структуру, я также должен помнить, чтобы добавить его в функцию копирования.
Есть ли более умный способ сделать это?
1 ответ
Это слишком умный способ сделать это, используя прекомпилятор:
MYDATA-fields.h
FIELD(int, one)
FIELD(char, two)
FIELD(long, three)
mydata.h
#define FIELD(t, n) t n;
struct MyData
{
#include "mydata-fields.h"
};
struct __attribute__((packed)) MyDataPacked /*or whatever your compiler needs */
{
#include "mydata-fields.h"
};
#undef FIELD
#define FIELD(t, n) a->n = b->n;
static inline void Unpack(MyData *a, MyDataPacked *b)
{
#include "mydata-fields.h"
}
static inline void Pack(MyDataPacked *a, MyData *b)
{
#include "mydata-fields.h"
}
#undef FIELD
ОБНОВЛЕНИЕ: С некоторой фантазией вы даже можете написать обобщенный pack.h, который получает имена структуры и файла полей в качестве параметров:
экстракт упакованного
/* ... */
struct UNPACKED
{
#include FIELDS_H
};
/* and so on... */
А потом просто в реальном файле:
mydata.h
#define UNPACKED MyData
#define PACKED MyDataPacked
#define FIELDS_H "mydata-fields.h"
#include "packed.h"
#undef FIELDS_H
#undef PACKED
#undef UNPACKED
Это будет полезно, если у вас много упакованных / распакованных структур и вы хотите избежать набора текста.
Не таким злым решением было бы написать скрипт (на Python!), Который генерирует код из спецификации полей в некотором входном текстовом файле.