0

16 ビット マイクロコントローラー用の C コードをいくつか作成しています。ターゲットでアプリケーションをデバッグすると、最終的に AddressError ISR が発生します。データ シートを読んだところ、奇数メモリ アドレスに配置された 16 ビット値を読み書きしようとすると、これが発生する可能性があると書かれています。それが何を意味するかは理解できると思いますが、正しくないようです。次のような構造体を作成したとしても、それは意味しません。

struct foo{
    uint8_t thing1;
    uint16_t thing2;
};

エラーなしでthing2に読み書きすることは決してできないでしょうか?そうでない場合、それはコンパイラが自動的に事 1 と事 2 の間に 8 ビットをパディングして、事 2 が偶数アドレスで適切に整列されることを意味しますか? その場合、アドレス エラーはどのように発生するのでしょうか。

4

3 に答える 3

0

おそらく、デフォルトの構造の配置を変更する必要があります。コードまたはコンパイラ オプションでプラグマを使用できます。gcc の場合は -fpack-struct[=n] です。

于 2012-12-14T12:58:24.907 に答える
0

これをインスタンス化する方法に応じて:

struct foo{
    uint8_t thing1;
    uint16_t thing2;
};

偶数アドレスにアラインされている可能性がありますが、コンパイラが十分に賢くない場合、thing2 の間にパディングが追加されず、thing2 が奇数アドレスになるため、エラーが発生します。メンバーの順序を変更するか、コンパイラのドキュメント (おそらくいくつかのプラグマ プリプロセッサ ディレクティブ) を検索して、コンパイラがデータの整列を支援できるようにします。

于 2012-12-14T13:15:51.120 に答える
0

ほとんどの小さなフットプリント プロセッサでは、限られた一連のメモリ操作しか許可されていません。これは、位置合わせされていないメモリの読み取りを 2 サイクル以上で完了する必要があり、プロセッサ全体の複雑さが増すためです。

スタック変数と構造体メンバーの両方が型のネイティブ幅 (または 4 または 8 バイトのいずれか小さい方) に合わせられるため、これは c コードではあまり見られません。これは、属性packedでオーバーライドでき、構造体へのポインターをミスアラインされたアドレスに再割り当てできます。したがって、アドレスのミスアラインメントの例外に簡単に慣れることができます。

例えば。Intel 8086 は、アラインされていないアドレスでの 16 ビット読み取りをサポートしていましたが、セグメント境界 (オフセット 0xffff) をまたぐワードにアクセスしようとすると、アドレス生成例外のオプションが引き続きありました。

于 2012-12-14T07:05:32.910 に答える