1

STM32F105RC プロセッサに ARM GCC を使用しています。
私のアプリケーションでは、次のようなものになりました。

typedef struct
{
  uint16_t coinValue;
  uint8_t  minimumCoins;
} MIN_COIN_RENDERING;

typedef struct
{
  uint16_t coinValue;
  uint8_t  hopperType;
  uint8_t  motorDelay;
} CONFIG_HOPPER;

typedef struct
{
  MIN_COIN_RENDERING minCoinRendering[10];
  CONFIG_HOPPER hopper[5];
  uint8_t reservedFFU[X];
  //
  uint16_t crc;
} APPLICATION_CONFIG; // MUST have 128 bytes!

最初の問題は、予約されている FFU (上に X でマークされている) のバイト数を正しく決定する方法です。
X = 128 - (10 x 3 + 5 x 4 + 2) = 76 と言ったら、これは正しくありません。
X の正しい値は 66です。これは、コンパイラが (少なくともコンパイラの既定の設定で) 構造体のフィールドを整列させるためです。
EEPROM に保存/復元されるため、全体の構造は 128 バイトである必要があります。この構造は、EEPROM にあるもののシャドウ コピーとして使用されます...

私の質問: APPLICATION_CONFIG 構造体に新しいフィールドを追加する (または何かを変更する) たびに、reservedFFU サイズを台無しにすることなく (EEPROM 用に) シャドウ コピーを作成する (より適切で柔軟な) 方法はありますか?

4

3 に答える 3

2

特定のオフセットのデータを含む固定サイズの何かが必要であるという事実は、部分構造、部分配列である何かが必要なように聞こえます。crc を少し違った方法で扱う準備ができているのであれば、まさにそれを持っていないのはなぜですか!

typedef union
{
  struct {
    MIN_COIN_RENDERING minCoinRendering[10];
    CONFIG_HOPPER hopper[5];
  };
  uint16_t raw[64];
} APPLICATION_CONFIG;

// Then e.g.
APPLICATION_CONFIG config;
config.hopper[3].motorDelay = 7; // Thanks to anonymous structures
uint16_t *crcptr = &config.raw[63];
于 2015-10-23T12:47:25.720 に答える
0

最初の問題は、予約されている FFU (上に X でマークされている) のバイト数を正しく決定する方法です。

コンパイラが構造内のフィールドを整列させ、実際には実装定義であるという事実について言及したように、コンパイラの設定を確認して、データがどのように正確に整列されるかを確認する必要があります。構造のアライメント設定を変更するためのステートメントがいくつか含まれている可能性があります (ARM GCC を十分に深く掘り下げて、確実に言うことはできません)。

私の質問: APPLICATION_CONFIG 構造体に新しいフィールドを追加する (または何かを変更する) たびに、reservedFFU サイズを台無しにすることなく (EEPROM 用に) シャドウ コピーを作成する (より適切で柔軟な) 方法はありますか?

残念ながら、私はこの質問に直接答えることはできません。私の観点からは、それはあなたの質問の最初の部分の解決策に依存します.

于 2015-10-23T12:44:05.873 に答える