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);

我不知道为什么 baseAddr0 在第二个 printf 中为 0,而在第一个 sharedMemory 中为 0x500000。

4

3 回答 3

1

rioShardMemoryWindowGetuint8_t **baseAddrPtr如果你想修改它应该接受baseAddr0。然后你就*baseAddr = sharedMemory没有演员表了。

于 2013-01-24T14:39:07.297 回答
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 回答
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 位的,这就是你看到 0 使用 8 位值的原因,因为 0x500000 映射到 0x00 到一个字节

于 2013-01-24T15:13:25.130 回答