【问题标题】:BCM2835 datasheet addressing systemBCM2835 数据表寻址系统
【发布时间】:2020-07-01 04:27:06
【问题描述】:

很长一段时间以来,我一直对为我的旧 Raspberry Pi 编写内核感兴趣,并设法编写了一些我在剑桥大学著名的“烘焙 Pi”课程中找到的 ARM 汇编代码。因为我知道一些 ARM 程序集,所以我想深入研究数据表,但发现“它包含几个错误”(尽管我还发现了一个勘误表),并且我在理解以下内容时遇到了一些麻烦:

第一课说“手册使用不同的寻址系统。列为 0x7E200000 的地址将是 0x20200000”,这将是 GPIO 接口的地址。

我不明白的是:这两个地址之间是否存在对应关系?我可以使用某种转换来读取数据表吗?

谢谢:)

附:我试图将其发布到树莓派网站,但据我所知,它不是很活跃..

【问题讨论】:

  • 是的,对于较旧的部分,手臂 11 每当您看到 0x7E000000 时,只需将 0x20000000 用于较新的部分,我认为这是 0x3F000000。该文档是针对 GPU 地址空间编写的,而 arm 地址空间是不同的(如该文档中所示)。如果从北方来,我的房子在右边第三个。但从南方看,它是左边的第 7 个。同样的房子,同样的街道,不同的景色。
  • 无需在您的代码中进行转换,但由于这已成为历史的一部分,而且我们知道他们再次更改了地址,因此手臂无疑可以拥有更多的内存,您可能希望这样做您定义中的基础+偏移量。然后 ifdef 基于哪个平台的基础。 (或运行时它,它是你的软件设计)。
  • 裸机论坛是一个罕见的例子,在这个系列的产品中远远优于 stackoverflow。很多非常详细的技术知识。这个特定的话题已经被报道过无数次了,所以通常可能不会引起太多关注。烘焙 pi 也有被无数次覆盖的 bug。论坛上有很多裸机示例可以从 arm11 (armv6)、armv7 和 armv8 开始。
  • 非常感谢 cmets!我去看看裸机论坛,希望对你有帮助:)
  • 再一次,就数据表而言,您在旧 pi 板上用作 0x20 的 0x7E 地址。较新的臂已被交换,因此外围设备相同,只是基地址不同。 pi 的人选择一次点亮所有的手臂,而不是让软件打开其他三个(对于多核的),所以论坛上的链接中有示例代码,用于“排序核心”的代码,你基本上需要将其中三个停在无限循环中,否则所有四个都尝试线性执行所有代码,这会导致问题。您可以将 aarch32 或 aarch64(或两者)与 newrones 一起使用

标签: raspberry-pi bare-metal


【解决方案1】:

数据表似乎是从 GPU 的寻址视图编写的,这与 ARM 的视图不同。 (文件中显示的排序)。具有 ARM11 内核的较旧 pi 芯片在 ARM 地址空间中外围设备的基地址是 0x20000000,您忽略 0x7E 部分并在脑海中“转换”为 0x20。对于 pi 上使用的较新芯片,ARM 内核已被换出,可能会为 ram 提供更多线性空间,外围设备的 ARM 基地址类似于 0x3F000000,因此当您看到一些 0x7Exxxxxx 地址时,您使用 0x3Fxxxxxx 地址。

虽然它可能不活跃,但树莓派裸机论坛充满了对这些芯片/电路板非常详细的知识以及许多优秀示例的链接(比长期烘焙 pi 更好)。该论坛是资源远远优于stackoverflow的案例之一。同时,这个问题已经被问了无数次,所以可能无法保证答案,在论坛页面的教程和示例中都有介绍。

由于可用性、价格,尤其是那个论坛,这是一个学习裸机以及可能涉足编写操作系统的非常好的平台。 pi-zeros 仍然可用并使用 ARM11,是此类工作的最佳起点。一旦你的脚湿透了,就转向更复杂的核心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-28
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多