【发布时间】: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 一起使用