私は組み込みデバイスを扱っていますが、もともと IAR コンパイラを使用してコンパイルされたコードがいくつかあります。
GCCコンパイラを使用して上記のコードを再コンパイルしようとしています。
特定のステートメントがあります: typedef __IO
、単にコンパイルされません (「認識されないシンボル エラー」)。
このステートメントを適切にコンパイルする方法を誰かが提案できますか?
認識されない場合は、定義を含む適切なシステム ヘッダーが含まれていないことが原因です。
これは、ツールチェーンで提供されるチップ サポート ヘッダー ファイルで定義されます。型修飾子、または型修飾子に展開されるマクロ ( )#define
です。たとえば、次のように使用されます。
__IO uint8_t CSSR;
ここuint8_t
に型があるので、__IO はtypedef
型が有効な場所では使用されないため、実際には a になることはできません。__IO マクロは、正しい I/O アクセスとアドレス指定を保証するために特定のコンパイラが必要とするものに展開されます。I/O がメモリ マップされている典型的なケースでは、volatile
明示的なアクセスが最適化されないようにすべての I/O を volatile と宣言する必要があるため、単純に展開されます。
確認したい場合は、IAR ツールのデモ バージョンをダウンロードし、特定のアーキテクチャに対してどのように定義されているかをヘッダー ファイルで確認してください。そうでなければ、あなたはただ使うかもしれません#define __IO volatile
_IO は C 言語のように揮発性を意味します...これはコードを最適化せず、_IO を使用して変数に指定された値は予測できないか、コンパイラとユーザーの知識なしに変更されます