我对使用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标准并没有提供整型的确切大小。