7

ARM Cortex M3 の内部フラッシュに保存したい構成構造があります。仕様上、内部フラッシュに保存するデータは 32bit に揃える必要があります。構造体にはブール値と文字がたくさんあるので、8 ビットを格納するために 32 ビットを使用したくありません...__packedプリプロセッサ プラグマを使用して構造体をパックすることにしました。次に、構造体全体として保存すると、構造体のサイズが 4 で割り切れる (4 バイト = 32 ビット) ことを確認する必要があるだけです。必要に応じてパディング バイトを追加します。現在、開発中に構造を大幅に変更し、32 ビットに合わせるため、常にパディング バイトを変更する必要があります。現在、構造はこのように見えます

typedef __packed struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...] // this has to be changed every time I alter the structure.
} CONFIG;

私がやっていることを達成するためのより良い方法はありますか? 私は組み込みプログラミングの初心者であり、間違いを犯していないことを確認したいと考えています。

編集:注意してください。データは内部フラッシュの最後に保持されるため、パディングを省略しても機能しません...

4

4 に答える 4

4

おそらくこれはアイデアです:

typedef __packed struct {
    uint8_t status;
    uint16_t delay;
    uint32_t blabla;
    uint8_t foo[5];
} CONFIG;

typedef __packed struct {
    CONFIG cfg;
    uint8_t padding[4 - (sizeof(CONFIG) % 4)]
} CONFIGWRAPPER;
于 2011-12-15T08:19:01.153 に答える
4

まず、パック アラインメントは通常避けるべきです。データが本来の境界にアラインされていない場合、一部の CPU はアクセスしようとするとトラップを発行します。

最初に、コンパイラがアラインメントのためにギャップを追加しないように、メンバーを順番に格納します (または、アラインメントのためのギャップを追加する場合は最後に追加します)。可能であれば、 1. メンバーに必要なアライメント要件を持たせます。これにより、コンパイラーは少なくとも構造体にそれだけのアライメントを与えるようになります。

これには、プラットフォームとコンパイラのアラインメント要件がどのようになっているのかについての知識が必要です。たとえば、パディング配列を取り除き、変更します。

typedef struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...];
} CONFIG;

typedef struct
{
uint32_t blabla;
uint16_t delay;
uint8_t status;
uint8_t foo[5];
} CONFIG;

次に、この構造体には 4 バイトのアラインメントが必要であることをコンパイラに伝えます (この場合、最初のメンバーには 4 バイト以上のアラインメント要件があるため、既にそうなる可能性があります)。たとえば、gcc を使用する場合attribute((__aligned__(4))

次に、配置要件を検証する小さなテスト プログラム (構造体で sizeof() と alignof() を使用する小さなプログラム) を作成します。構造体に命令を追加する必要があるかどうかもわかります。整列する。そのプログラムをビルド/パッケージングの一部として実行します。

于 2011-12-15T08:54:26.607 に答える
4

解決策 1: 構造体と文字の配列を含むユニオン内に配置できます。

union
{
  CONFIG config;
  uint8_t total_size[32];
} my_union;
于 2011-12-15T08:28:39.490 に答える
1

解決策 2: IAR 固有の機能#pragma locationを使用して、構成データを特定の場所 (フラッシュの最後から 32 など) に配置できます。そうすれば、構造をパディングする必要はありません。

/* Fictitious end of flash location. */ 
#pragma location=0x1234FFE0
struct [... your struct goes here ...]
于 2011-12-15T08:30:50.300 に答える