1

私は次のコードを持っています:

    /* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint8_t *baseAddr,uint32_t *memorySize,uint32_t *windowAddress  )
{
    *baseAddr=(int)sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);

最初の sharedMemory では 0x500000 であるのに、2 番目の printf では baseAddr0 が 0 である理由がわかりません。

4

3 に答える 3

1

rioShardMemoryWindowGetuint8_t **baseAddrPtr変更する場合は受け入れる必要がありますbaseAddr0*baseAddr = sharedMemoryその後、キャストなしで持っているでしょう。

于 2013-01-24T14:39:07.297 に答える
1

わかりました、私はあなたの問題を理解していると思います。

baseAddr0 にアドレス番号を格納しようとしているのですね。(理由はわかりませんが、これが私が思いついた唯一のものです)。

0x500000 が 0 として表示されている理由は、uint8_t がアドレスを表すのに十分なビットを持っていないため、1 バイトのみに「カリングダウン」しているためです (したがって 0 を表示しています)。

baseAddr を uint32_t に変更すると、すべてが機能します。

とにかく、他のポスターがポインタからポインタへのポインタを使用するように言っている理由は、アドレスを表示したり、オフセットとして使用したりするなどの特別な目的でアドレスを使用する予定がない限り、あなたがしているように見えることが奇妙だからです。 ?

ps: この行も変更する必要があります

*baseAddr=(uint32_t)sharedMemory;

編集: 必要なものを取得するには、コードは次のようになります。

    /* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint32_t *baseAddr,uint32_t *memorySize,uint32_t     *windowAddress  )
{
    *baseAddr=(uint32_t)sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);

数値アドレスを格納するために uint32 が必要な理由は、アドレスが 32 ビットであるためです。これが、0x500000 が 0x00 にマップされるため、8 ビット値を使用して 0 が表示される理由です。

于 2013-01-24T15:13:25.130 に答える
1

ポインターへのポインターを関数の引数として渡す必要があります。そうして初めて、値をそこに格納できるようになります。あなたの場合、のアドレスを場所に保存しようとしましsharedMemorybaseAddr[0]

/* Window size in bytes. */
static  uint32_t size = 0;
    /* Window address. */
static  uint32_t address = 0;
    /* Memory Base Address */   
static uint8_t *sharedMemory=NULL;

sharedMemory = memalign(size, size);

void rioShardMemoryWindowGet (uint8_t **baseAddr,uint32_t *memorySize,uint32_t *windowAddress  )
{
    *baseAddr=sharedMemory;
    printf("sharedMemory: #%x",sharedMemory);
    *memorySize=size;
    *windowAddress=address;
}
uint8_t *baseAddr0;
rioShardMemoryWindowGet(&baseAddr0, &baseSize, &(Addrs.virtualBaseAddr));
printf("baseAddr0 : #%x",baseAddr0);
于 2013-01-24T14:45:10.670 に答える