解决指针C / C ++的不同方法

时间:2014-06-23 05:34:34

标签: c embedded pointers

我对使用c样式指针访问特定地址感到有些困惑。

我有一个32位芯片,我试着编程。我需要在ram中翻转一些东西或其他东西。以下解决方案正常。

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; 

我已经炖了一段时间了。我认为这可能是编译器做了一些有点优化。希望你们其中一个人可以向我解释什么是错误的,或者指出我的资源来解决这个问题。

1 个答案:

答案 0 :(得分:1)

在第二个解决方案中,您正在键入

(uint32*)

而不是

(volatile uint32*)

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

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

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

请注意,一般来说,您应该始终使用sizeof(uint32)而不是文字常量。它有助于提高可读性,C标准不能为您提供完整的整数类型。