我对使用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;
我已经炖了一段时间了。我认为这可能是编译器做了一些有点优化。希望你们其中一个人可以向我解释什么是错误的,或者指出我的资源来解决这个问题。
答案 0 :(得分:1)
在第二个解决方案中,您正在键入
(uint32*)
而不是
(volatile uint32*)
这允许编译器优化内存访问并重新排序写入。如果此代码是更大例程的一部分,并且硬件希望您按顺序编写,则可能是问题所在。
在第三个解决方案中,正如布朗博士已经说过的那样,你必须除以4得到:
ram += (strbase+0x48)/4;
请注意,一般来说,您应该始终使用sizeof(uint32)而不是文字常量。它有助于提高可读性,C标准不能为您提供完整的整数类型。