2

STM32/FreeRTOS から OMAP2430/WindowsCE プラットフォームにコピーされた完全なプロジェクトと言うべきコードがいくつかあります。

コピーされた C/C++ ファイルには、実行時に作成および破棄されるデータ構造を処理するコードがいくつかあり、サイズとアドレスの配置は、それぞれの作成中にデータ構造に入るデータの量に完全に依存します。

アドレスのアライメントを正しくするためにパッキング/パディングを使用したくありませんが、データ構造のアライメントされていないアクセスを許可するコンパイラ オプションを使用したいと考えています。今のところ__unaligned、データ構造ポインタに型修飾子を使用しています (UNALIGNEDマクロ from Windef.h)

パフォーマンスが低下する可能性があることはわかっていますが、コードのこの特定のセクションではそれを受け入れることができます。

仲間のプログラマーから知りたいのは、Windows CE コンパイラの設定に、すべてのメモリ アクセスを強制的に非整列にするオプションがあるということです。私はこのようなことについて話しているhttps://blogs.oracle.com/d/entry/on_misaligned_memory_accesses

どんな答えでも大歓迎です。

ありがとう

4

2 に答える 2

1

ARM では、アラインされていないアクセスは、x86 でのパフォーマンスの低下ではなく、ハードウェア エラーである可能性があると思います。したがって、コンパイラがそのようなアクションを実行できない可能性があります。

于 2012-07-03T17:47:58.020 に答える
0

いくつかのオプションがあります。

特定の要素を__unalignedに設定するとそれが行われます。だから:

# pragma pack (1)
struct x_
{
   char a;    // 1 byte
   int b;     // 4 bytes
   short c;   // 2 bytes
} MyStruct;
# pragma pack ()

または/Zp1を使用してコンパイラコマンドラインでパッキングを設定します

ターゲットプロセッサがアラインされていないアクセスによるポインタの逆参照をサポートしているかどうかはすぐにわかります。サポートできない場合は、アラインされていないアクセスでバスエラー(SIGBUS)が発生します。

ポインタをたどる前にデータ構造からポインタをコピーするだけで、おそらく両方の長所を活かすことができます。たとえば、一時的に関数ポインタに割り当てるだけです。

于 2012-07-03T17:54:46.130 に答える