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.
是否有人告诉我启用 MPU 是否会提高处理器性能?
我们刚刚发现、在 TMS570LS1227上禁用 MPU (无需进行其他更改)会将处理器负载增加大约7%至10%。 由于我们打算使用 MPU、我们很高兴这似乎可以提高处理器性能、但我们想了解原因。
我们发现的任何文档似乎都暗示 MPU 不应影响处理器性能、但这与我们的经验相反。
谢谢、
Steve
您好 Steve、
存储器区域从 MPU_STRONGLYORDERED_sharable 更改为 NORMAL、否则器件 将加速写入速度。 但 DMA 速度保持 不变。
只有当传输被存储器或外设器件确认为完成时、对严格排序存储器的写入才被视为完成。 因此、写入严格顺序存储器的速度较慢。
您是否将数据写入连接到 EMIF 的外部存储器? SDRAM 和外部异步存储器(SRAM)应配置为器件模式、而不是正常模式。
感谢 QJ、
抱歉、我的回答很慢。
我们的 MPU 配置可以将外设帧(0xFC000000 - 0xFFF80000)设置为器件。 这些区域是否默认为 STRONGLYORDERED?
除了《ARM 架构参考手册》中的一句话、"必须将内存映射的寄存器映射到 STRONGLYORDERED 或器件存储器"、我似乎找不到关于此内容的任何详细信息。
再次感谢、致以诚挚的问候、
Steve
您好、Steve、
器件和严格排序类型的数据访问 通常用于 外设。 无法从具有器件或严格排序存储器类型属性的区域执行指令。
感谢 QJ、
不过、请理解、除非外设区域默认配置为进行严格排序的访问、或者禁用 MPU 会影响性能、否则我不确定性能差异来自哪里。
我上次忘记说我们没有使用任何外部存储器、因此没有通过 EMIF 进行访问、不幸的是、EMIF 将这种情况排除在可能性之外。
我们的 MPU 配置如下-所有 RAM 和闪存区域(包括 RAM ECC 区域)均配置为正常数据访问、 外设区域和 CRC 区域配置为器件类型访问、系统模块区域配置为严格排序访问...由于某种原因、此配置使我们的性能比默认(MPU 禁用)设置提高了7%至10%!
表中的第一列是 MPU 区、如果我记得正确的话、我们的配置松散地基于应用报告 SPNA177 (MPU 配置)、主要目的是捕获堆栈溢出。
0 |
0x00000000 -- 0x0013FFFF | 正常、读取\写入 | (编程闪存) |
1 | 0xF0000000 -- 0xF07FFFFF | 正常、读取\写入、从不执行 | (数据闪存) |
2. | 0x08000000 -- 0x0802FFFF | 正常、读取\写入 | (RAM) |
3. | 0x08400000 -- 0x0842FFFF | 正常、读取\写入、从不执行 | (RAM ECC) |
4. | 0xFC000000 -- 0xFF7FFFFF | 设备、读取\写入、从不执行 | (外设帧1和2 -还包括 CRC 和保留区) |
5. | 0x08000020 -- 0x0800003F | 无访问权限、从不执行 | (用户堆栈保护区域) |
6. | 0x08000820 -- 0x0800083F | 无访问权限、从不执行 | (SVC 堆栈防护区) |
7. | 0x08001020 -- 0x0800103F | 无访问权限、从不执行 | (FIQ 堆栈保护区域) |
8. | 0x08001820 -- 0x0800183F | 无访问权限、从不执行 | (IRQ 堆栈保护区域) |
9. | 0x08002820 -- 0x0800283F | 无访问权限、从不执行 | (中止堆栈保护区域) |
10. | 0x08002C20 -- 0x08002C3F | 无访问权限、从不执行 | (UNDEF 堆栈保护区域) |
11. | 0xFFF80000-- 0xFFFFFFFF | 严格排序、特权读取\写入、从不执行 | (系统模块) |
谢谢、此致、
Steve
Steve、
Cortex R4F TRM 的存储器保护单元(MPU)一章有一个默认的存储器映射和属性表。 请参见随附的。
请注意、您将0xFC000000 - 0xFF7FFFFF 范围内的存储器(模块寄存器)配置为"器件"类型。 这些存储器本来是在禁用 MPU 的情况下严格排序的。 将它们配置为器件类型可在 CPU 内缓冲写入访问、从而提高 CPU 带宽。
另一个观察结果:根据您的 MPU 配置信息、有几个外设模块未映射到任何存储器区域。 这会导致对这些外设的读或写访问出错。 例如、0xFFF7C000处的 MibADC1根本没有被映射。 如果您不使用这些模块、这是可以的。 请检查区域4的结束地址是否应为0xFFF7FFFF 而不是0xFF7FFFFF。
此致、
Sunil
非常感谢 Sunil。
这将解释性能差异。
我现在已经在 Cortex-R4 TRM 中找到了这个部分(除了这个部分之外、我还在查看所有 TRM!) 我认为这表明、为了便于我们使用、将外设寄存器配置为"设备"类型存储器是可以的、但如果我误解了、您能否确认、从"设备"类型存储器读取的操作仅在写入缓冲区中的任何待处理写入完成后才会发生? 那么、从器件存储器进行的任何读取操作将始终与之前的写入保持一致?
您对外设寄存器区域的地址是正确的-我没有正确地读取我们的设置,因为我们将该区域划分为子区域,所以它实际上覆盖了0xFC000000 -- 0xFCFFFFFF 和0xFE000000 -- 0xFFFFFFFF。
此致、
Steve
您好、Steve、
是的、从任何器件类型区域进行的读取会强制清空写入缓冲区(等待写入完成)。 您还可以通过在汇编语言中显式执行数据同步边界(DSB)指令来强制清空 CPU 写入缓冲区。
此致、Sunil
您好、Sunil、
感谢你的帮助。
我想我们现在已经了解了提高性能的原因...而且、至少对于我们的系统而言、这是对默认设置的安全更改。
此致、
Steve