0

CodeWarriorMC9S08DZ60.hを使用して Visual Studio プロジェクトを作成しています。私は得ています:

エラー C2054: '(' は '_PTDD'` の後にあると予想されます。

MC9S08DZ60.hは、マイクロコントローラMC9S08DZ60 ( Freescale Semiconductor製)のヘッダー ファイルです。

typedef union {
    byte Byte;
    struct {
        byte PTDDD0  :1;  /* Data Direction for Port D Bit 0 */
        byte PTDDD1  :1;  /* Data Direction for Port D Bit 1 */
        byte PTDDD2  :1;  /* Data Direction for Port D Bit 2 */
        byte PTDDD3  :1;  /* Data Direction for Port D Bit 3 */
        byte PTDDD4  :1;  /* Data Direction for Port D Bit 4 */
        byte PTDDD5  :1;  /* Data Direction for Port D Bit 5 */
        byte PTDDD6  :1;  /* Data Direction for Port D Bit 6 */
        byte PTDDD7  :1;  /* Data Direction for Port D Bit 7 */
    } Bits;
} PTDDDSTR;
#ifndef MXVDEV //sri
extern volatile PTDDDSTR _PTDDD @0x00000007;
#else
PTDDDSTR _PTDDD;
#endif
#define PTDDD             _PTDDD.Byte
#define PTDDD_PTDDD0      _PTDDD.Bits.PTDDD0
#define PTDDD_PTDDD1      _PTDDD.Bits.PTDDD1
#define PTDDD_PTDDD2      _PTDDD.Bits.PTDDD2
#define PTDDD_PTDDD3      _PTDDD.Bits.PTDDD3
#define PTDDD_PTDDD4      _PTDDD.Bits.PTDDD4
#define PTDDD_PTDDD5      _PTDDD.Bits.PTDDD5
#define PTDDD_PTDDD6      _PTDDD.Bits.PTDDD6
#define PTDDD_PTDDD7      _PTDDD.Bits.PTDDD7
4

3 に答える 3

1

CodewarriorレジスタマップはC標準に準拠していません。特定のアドレスに変数を割り当てるために使用される@演算子は標準ではなく、int以外のタイプのビットフィールドでもありません。

非標準の構文を使用している理由は、ユーザーがデバッガーでそれらを表示できるように、レジスターのデバッグ情報を生成したいためです。標準Cを使用して、それらを手動で定義できます。

#define PTDDD (*(volatile unsigned char*)0x0007)

ただし、レジスタマップですべてのレジスタを定義する場合は、かなりの作業が必要になります。

個人的には非標準の構文が嫌いなので、自分で書いた小さなプログラムを使用して、PDFマニュアルを解析し、マニュアルの名前に基づいて、上記と同じ構文のレジスタマップを生成します。


しかし...なぜWindowsでMCUレジスタマップをコンパイルしたいのですか?それは意味がありません。Visual Studioは、Freescaleマイクロコントローラーについてnullとvoidを認識しているため、それらのバイナリを生成できません。

于 2012-08-17T06:12:37.537 に答える
0

プリプロセッサによって定義されていない場合MXVDEVは、宣言があります

extern volatile PTDDDSTR _PTDDD @0x00000007;

この@0x00000007部分はおそらくCodeWarriorコンパイラの拡張であり、Visual Studioコンパイラには含まれていないため、エラーが発生します。

于 2012-08-17T05:47:15.177 に答える