gpt4 book ai didi

c - 关于内存映射接口(interface)的进一步问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:21 25 4
gpt4 key购买 nike

我的处理内存映射设备的 C 代码仍然存在一些问题。目前我声明我写的寄存器的地址空间是易失的指针,我将数据写入它们,如下所示:

volatile unsigned int *wr_register = (int *) 0x40000000;
volatile unsigned int *c_register = (int *) 0x40000100;
...

main{

*wr_register = 0x01234567;

*c_register = 0x01234567;
*(c_register+1) = 0x89abcdef;

}

这或多或少可以正常工作。但是,我想具体阅读和编写与内存映射寄存器交互的函数。所以理想情况下,它看起来像这样:

const unsigned int wr_register = 0x40000000;
const unsigned int c_register = 0x40000100;

function write_REG(unsigned int address, int offset, int data)
{
(unsigned int*) (address + offset) = data;
}

main{

*write_REG(0x40000000, 0, 0x01234567);

*write_REG(0x40000100, 0, 0x01234567);
*write_REG(0x40000100, 1, 0x89abcdef);

}

老实说,我还没有尝试过,但我想知道是否有人可以告诉我这是否是正确的方法?

编辑:也许它对其他人有用,这里我有我的功能,它们似乎可以工作。非常感谢有用的评论!

void reg_write(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}

int reg_read(unsigned int address, int offset)
{
return(*((volatile unsigned int*)address + offset));
}

非常感谢

最佳答案

你的代码有很多问题:

  1. 我假设您的意思是 void,您在其中编写了 function
  2. 您还应该使函数内部的指针成为 volatile
  3. 您应该在写入数据之前取消对指针的引用。 * 应该在函数内部,而不是像现在这样在调用站点 (*write_REG) - 这将是一个编译错误。
  4. 您应该将偏移量添加到指针,而不是地址。这是因为偏移量 1 意味着下一个 int 可能相距 4 个字节,但将其添加到地址只会增加 1 个字节。

您更正后的函数应如下所示:

void write_REG(unsigned int address, int offset, int data)
{
*((volatile unsigned int*)address + offset) = data;
}

你会这样调用它:

write_REG(0x40000000, 0, 0x01234567);

关于c - 关于内存映射接口(interface)的进一步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166201/

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