0

AT91SAM7 用の Atmel ライブラリ USB を調べましたが、理解できないことがあります。エンドポイントは、次のように定義された構造体です。

typedef struct {
    volatile unsigned char  state;
    volatile unsigned char  bank;
    volatile unsigned short size;
    Transfer       transfer;        //thus Endpoint contains an instance of "Transfer"  
} Endpoint

点; また、 Transfer 自体は次のような構造です。

typedef struct {
    char             *pData;
     volatile int     buffered;
    volatile int     transferred;
    volatile int     remaining;
    volatile  TransferCallback  fCallback;
     void             *pArgument;
} Transfer; 

TransferCallback は、次のプロトタイプを持つ関数です。

typedef  void  (*TransferCallback)(void *pArg,  unsigned char status, unsigned int transferred, unsigned int remaining);

また、2 つのポインターが次のように定義されています。

Endpoint *pEndpoint = &(endpoints[bEndpoint]);
Transfer *pTransfer = &(pEndpoint->transfer);

関数 TransferCallback を呼び出すこのような方法が有効である理由を知りたいです。

((TransferCallback) pTransfer->fCallback) (followed by the required arguments passed )

しかし、これは有効ではありません:

((TransferCallback)pEndpoint->transfer->fCallback)?

間に pTransfer などのポインターを使用せずに TransferCallback を直接呼び出すにはどうすればよいですか? いくつかの組み合わせを試しましたが、どれもうまくいきませんでした。

4

2 に答える 2

4

Transferメンバ ( )へのポインタEndpointではなく、 Transferメンバがあることに注意してください。マシン用語では、それぞれのメモリ内の単一ワードがへのポインタとして使用されるのではなく、メンバのすべてのフィールドが に割り当てられたメモリ内に直接格納されます。*TransferEndpointTransferTransferEndpoint

要するに、必要なものは次のとおりです。

((TransferCallback)pEndpoint->transfer.fCallback)

于 2013-11-02T20:17:18.313 に答える