This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/PROCESSOR-SDK-AM335X:裸机访问和 MMU

Guru**** 2589245 points
Other Parts Discussed in Thread: AMIC110, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635194/rtos-processor-sdk-am335x-bare-metal-access-and-mmu

器件型号:PROCESSOR-SDK-AM335X
Thread 中讨论的其他器件:AMIC110SYSBIOS

工具/软件:TI-RTOS

您好!

是否有人能向我解释有关 MMU 和裸机访问的所有信息?

开个玩笑而已。

有人能给我点一些文档吗? 还是某条指令?  我有5、000页的 AM335x spruh73以及 ARM 参考手册、各种书籍...  但是、我在使用 Sys/BIOS 时无法获取裸机访问。  我在 CCS 7.2上使用 BBB、无论有无 TI-RTOS

当它尝试访问寄存器44e0 xxxx 时 、它似乎为我提供了一个数据总线中断。

问题如下:

使用旧版 StarterWare、可以调用初始化和启用 GPIO 端口。  具体而言、是 GPIO1。 我可以看到从复位运行直到进入"main()"的所有代码,因此我可以在尝试访问 GPIO 端口之前看到正在"封面下"执行的操作。  一切都很好。  

当我尝试将同一条语句引入到 Sys/BIOS 项目中时、它会崩溃。  

HWREG (SOC_CM_PER_REGS + CM_PER_GPIO1_CLKCTRL)|=
CM_PER_GPIO1_CLKCTRL_MODULEMODE_ENABLE; 

在这两种情况下,它都是在"main()"中执行的第一项操作。  我写它来进行调试。

因此、从逻辑上讲、Sys/BIOS 正在执行某项操作(或不执行某项操作)、这会导致生成数据总线错误中断的指令(至少、这似乎正在发生)。 它必须执行(或不执行)入口点"_c_int00"内的任何操作。   在 StarterWare 启动代码中、我可以看到没有什么显著的影响、这可能会影响到 the 直接寄存器访问。

在我们进入"main()"之前,我不知道 Sys/BIOS 在封面下面做什么,但不管怎样,我猜我必须“撤消”它。  我还猜测它与内存管理单元(CP15)有关。

所以我要问...  什么是内存系统、虚拟内存、内存访问控制的良好教程/介绍?  我已经阅读了大量的《ARM 架构参考手册》(来自 ARM 组)和大量的《AM335x 和 AMIC110 SitaraTm处理器技术参考手册》(SPRUH73)。  那么、要么是我错过了一个特定的章节、需要学习、要么是在某个地方有其他信息?

我已经在 TI E2E 上进行了搜索、发现的所有内容都已有3-6年历史、这意味着它对当前环境是无用的。

-CSW

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、他们没有回应。

    我继续挖掘、发现了以下内容:

    Sys/BIOS 显示为初始化4096 MMU 表条目,所有无效设置(位[1:0]= 00),但两个条目除外:

    位置 值
    0x80039008:0x40201e0e
    0x8003900C:0x40301e0e 

    但是、这些条目是 MMU 转换表中的1026个条目。 (表基= 0x80038000、此条目= 0x80039008)是否正确? MMU 表是否必须包含连续1MEG 块中的条目(因为 MMU 配置为1兆段)

    这些值、正如我所能解释的那样、将对段0x402和0x403的访问设置为:

    AP[2] AP[1:0]= 0 1 1 1或完全访问
    共享、可执行... 

    但是、这些不是 GPIO 或控制寄存器的位置、它们位于0x44E00000、0x4804C000等段中。

    那么、使用 Sys/BIOS、应该如何使用默认设置 MMU 的方式获得直接访问?  (我可以通过完全禁用 MMU 来解决此数据总线异常。)

    但为什么 Sys/BIOS 以这种方式初始化 MMU? 为什么不允许访问 GPIO 时钟和端口的段受到限制?

    在使用 Sys/BIOS 中记录了其中的任何内容?

    -CSW

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Christopher、

    我想您在使用 BIOS 时需要将外设添加到 MMU 表中。  如果您在 BIOS CDOC 中查看 ti/sysBIOS/家族/ARM/A8/MMU、应该会有一个示例说明如何在 MMU 表中添加外设。  您可以将配置添加到.cfg 文件中。  但愿这有所帮助。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现外设表就在这里。 它是不存在的时钟启用表。

    SYS/BIOS 架构中一个不错的大跳孔...

    (我已经解决了、并且一直在尝试布置4个小时。 网站没有响应....)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    (笑声)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    (笑声)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    (笑声)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    (笑声)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试并也使用了替代选项、即获取 MMU 转换表的位置、并在正确的位置添加所需的条目、然后执行汇编器代码以重新加载表。 我使用的函数如下所示、我在这里修改了旧版 StarterWare 中的几个汇编器调用。

    空 MMUConfigure()
    tablebase = CP15GetTableBase()  

    网站很糟糕   我无法发布代码。  它永远挂起...


    任何人都可以自由使用、修改、修复... 他们需要的一切。

    -CSW

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗯、解决我的问题需要几周时间。
    我通过收集书籍、搜索 ARM 网站、阅读人员博客、搜索 ARMv7器件的 ARM 文档来实现这一目标、TI 论坛完全没有任何帮助。 无。 零。 Zippo。 Zilch。

    问题是在一个示例中、MMU 正在以某种方式进行初始化、而在另一个 Sys/BIOS 示例中则未按相同方式进行初始化。

    对于 Sys/BIOS 执行此操作的原因、没有任何解释。 任何地方。

    我开始添加我自己的汇编器代码、从协处理器中提取各种设置、并在调试器中运行示例、以便我可以找到差异。 我还必须尝试"后退"调用堆栈、以查看在"main"之前的初始化期间所执行的操作。 我找到了。

    这两个示例都使用简短的形式、即1MEG 段 MMU 转换表。 有关这些表的说明、请参阅《ARMx7架构参考手册》(ARM ARM ARM)第 B3章第5节。 文档中大约有1300页。

    (请注意、每段4Gig / 1Meg 为4K 段、因此有4K 条目。 每个"段"都可以由其高12位进行标识、因此存储器位置0x44E0 00AC 位于存储器部分0x44E 中-使数学计算变得相当简单)

    我发现并非所有表都是相同的。

    使用向导生成的第一个 Sys/BIOS 示例的以下部分标记为可访问:

    0x402、0x403、0x480、0x482 

    尽管这涵盖了段0x480中的 GPIO 寄存器、但它不允许访问位于段0x44E 中的时钟模块外设。

    让我们重申一下、这样它就可以进入。 默认存储器访问允许程序写入 GPIO 寄存器、但不允许程序启用这些 GPIO 寄存器的时钟模块。 换句话说、尝试实际使用 GPIO 会导致数据总线故障。 减去几千分、以减少规划工作。

    TI 文档 spruh73第8章第12节介绍了这些时钟模块存储器位置

    工作示例中的其他段定义为可访问。 具体而言、

    0x44e 0x481 0x483 0x490 0x4A1 0x4A3 

    这些是用于外设(GPIO、串行通信、EDMA、以太网、PRU)的时钟模块

    如何设置 MMU 表? 由于没有组织的描述或支持、更多的时间投入到正在进行的工程中并进行反向工程... 它由 XDC 工具完成、由 CFG 文件控制、由 GUI 管理、不支持控制此信息。 即使在配置页上禁用"添加 MMU"、也不会禁用 MMU。 它似乎会在需要时打开"启用 MMU"。

    在 CFG 文件的 guts 中、它不受 XGCONF 花式 GUI 的任何部分控制、是 MMU 设置的集合。

    以下是一个很明显会创建 MMU 表的 Java 代码段:

    /*定义外设所在的1Meg 页的基址。 //
    var peripheralBaseAddr = 0x44e00000;
    
    //相应地配置相应的 MMU 页面描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、peripheralBaseAddr、peripheralAttrs); 

    哦,瞧! 这里是 GPIO 部分。 总的来说、"arm arm"手册中定义的各种位以及基址都在"peripheralAttrs"中设置。

    总之、如果您需要访问存储器、则需要破解 CFG 文件以使其正常工作。 可能会继续返回以确保它粘滞、因为它似乎是自己更改设置的。