【问题标题】:In Embedded Programming, are we dealing with Virtual address and Physical address?在嵌入式编程中,我们处理的是虚拟地址和物理地址吗?
【发布时间】:2013-10-10 16:06:49
【问题描述】:

来自硬件芯片的数据表,

Peripherals (at physical address 0x20000000 on) are mapped into the kernel virtual 
address

 space starting at address 0xF2000000. Thus a peripheral advertised here at bus address 
0x7Ennnnnn is available in the ARM kenel at virtual address 0xF2nnnnnn.

然后从示例代码,

  #define BCM2835_PERI_BASE          0x20000000

我认为程序员应该处理虚拟地址,物理地址隐藏在后面。 MMU 隐藏了物理地址较小的一面,使虚拟地址变大。最终用户/程序员将处理虚拟地址。

但是从上面看,示例代码显然使用了物理地址,为什么?

示例代码

     #define BCM2835_PERI_BASE           0x20000000
    #define GPIO_PADS       (BCM2708_PERI_BASE + 0x00100000)
    #define CLOCK_BASE      (BCM2708_PERI_BASE + 0x00101000)
    #define GPIO_BASE       (BCM2708_PERI_BASE + 0x00200000)
    #define GPIO_TIMER      (BCM2708_PERI_BASE + 0x0000B000)
    #define GPIO_PWM        (BCM2708_PERI_BASE + 0x0020C000)

   static volatile uint32_t *pads ;



 if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0)
return wiringPiFailure (WPI_ALMOST, "wiringPiSetup: Unable to open /dev/mem: %s\n", strerror (errno)) ;

       pads = (uint32_t *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_PADS) ;

【问题讨论】:

  • 您能否引用哪个硬件芯片,或找到该芯片的上下文链接?
  • Broadcom 2835 ARM 外设数据表。我只是问我们应该使用物理地址还是虚拟地址,这适用于所有硬件芯片,而不仅仅是博通的
  • 这段代码是否在ARM内核中运行?如果不是,则上述陈述不适用。
  • @arms,是的,它正在运行 ARM 内核。
  • 视情况而定。如果正在使用某些具有内存管理功能的操作系统(如 Linux),则程序员应使用虚拟地址。否则,程序员应该直接使用物理地址。

标签: c embedded


【解决方案1】:

虽然内核开发人员确实在虚拟内存中工作,但开发人员仍然需要担心物理内存。

您拥有的设备在物理地址 GPIO_PADS 处有一个 GPIO 控制器。您想要对需要访问其内存的 GPIO 进行编程。

您展示的代码调用mmap 获取GPIO_PADS 中的物理地址,并让MMU 将其映射到您的虚拟地址空间。您现在可以直接读取和写入内存并进行所需的 GPIO 编程。

【讨论】:

    猜你喜欢
    • 2015-12-26
    • 2015-05-04
    • 2013-05-05
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多