C/ c++中不同的指针寻址方法



我对使用c风格指针访问特定地址有点困惑。

我有一个32位芯片,我正试图编程。我需要在内存中翻转一些位。下面的解决方案可以正常工作。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;

ram[(strbase+0x48)/4] = 0x10000000; 
ram[(strbase+0x4c)/4] = 0x10000000; 
ram[(strbase+0x50)/4] = 0x10000000; 
ram[(strbase+0x54)/4] = 0x10000000; 
ram[(strbase+0x58)/4] = 0x10000000; 
ram[(strbase+0x5c)/4] = 0x10000000; 
ram += (strbase+0x60)/4;

然而,我有点困惑。我试着写了几个不同的子程序,我认为是等效的,但没有工作。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;
*(uint32*)(0x03000000 + 0x001683c8) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683CC) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D0) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D4) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683D8) = 0x10000000; 
*(uint32*)(0x03000000 + 0x001683DC) = 0x10000000; 
ram += (strbase+0x60)/4; 

下面的方法根本不起作用。

uint32 strbase = 0x00168380;
volatile uint32 *ram = (uint32*)0x03000000;
 ram += strbase+0x48; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 
 *ram++ = 0x10000000; 

这件事我已经纠结了一段时间了。我想可能是编译器在做一些优化。希望你们中有人能给我解释一下是什么问题,或者给我指出一些资源来解决这个问题。

在第二个解决方案中,您将类型定义为

(uint32*)
不是

(volatile uint32*)

允许编译器优化内存访问和重新排序写操作。如果这段代码是一个更大的例程的一部分,并且硬件希望您按顺序编写,这可能就是问题所在。

在第三种解决方案中,正如布朗博士已经说过的,你必须除以4才能得到:

ram += (strbase+0x48)/4;

请注意,一般来说,您应该始终使用use sizeof(uint32)而不是文字常量。它有助于可读性,C标准并没有提供整型的确切大小。

最新更新