gpt4 book ai didi

c - C/C++ 指针寻址的不同方式

转载 作者:行者123 更新时间:2023-11-30 15:32:10 26 4
gpt4 key购买 nike

我对使用 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*)

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

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

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

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

关于c - C/C++ 指针寻址的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com