1

パックされた構造で読み取る EEPROM (4KB) に多くの構成データがあります。ファームウェア全体で、これらの値を頻繁に読み取り/変更する必要があり、パックされた構造体のパフォーマンスは最適ではないため、まったく同じでパックされていない 2 番目の構造体があります。パックされた構造体からアンパックされた構造体に各値を 1 つずつコピーする必要がありますが、これはエラーが発生しやすいものです。

これを行うよりスマートな方法はありますか?

4

1 に答える 1

4

これは、プリコンパイラを使用してこれを行う非常にスマートな方法です。

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

UPDATE : 少し想像力を働かせれば、構造体の名前とフィールド ファイルをパラメーターとして受け取る汎用のpacked.hを書くこともできます。

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 で!) 作成することです。

于 2013-01-30T12:00:45.930 に答える