3

Cで書かれ、GCCコンパイラでコンパイルされたATmegaのコードがあります。

一部のデータは EEPROM に保存する必要があるため、次の宣言を追加します。

ここに画像の説明を入力

EEPROMを読んだ後、データが奇妙な方法で配置されていることがわかりました。いくつかの調査の後、.map ファイル (ツール チェーンによって生成された多くのファイルの 1 つ) で次のテキストを見つけました。

ここに画像の説明を入力

ご覧のとおり、コンパイラはデータを逆順に並べます。

もちろん、宣言を逆にしてさらにコーディングを楽しむこともできますが、これは予期しないことなので、コンパイラーがなぜそうなったのか理解できないまで、他の予期しない動作に直面することを恐れています.

何かご意見は?

4

1 に答える 1

2

@Lundin が述べたように、グローバル変数を連続して割り当てる必要はありません。

structそのメンバーが常に指定されているのと同じ順序で割り当てられるという機能を使用できます。
C11 標準から、§6.7.2.1.15:

構造体オブジェクト内で、非ビット フィールド メンバーとビット フィールドが存在するユニットには、宣言された順序で増加するアドレスがあります

ただし、 paddingに注意してください。

于 2015-12-22T07:34:14.063 に答える