在您的嵌入式项目中使用 MPU 可以为您节省大量的挫败感、时间和金钱。MPU 对嵌入式开发人员的最大好处是它能够在开发早期发现错误。早期发现错误可以显着减少开发时间。稍后在项目中修复代码中的错误可以减少记录和测试代码所需的返工。一方面,尽早修复错误将减少项目后期代码中出现的错误数量,这将简化识别和修复剩余错误的过程,因为多个错误不太可能同时出现,这有助于您维护一个更可预测的时间表并防止意外延误。
MPU 是如何做到这一点的?最明显的方法是保护所有与当前执行代码无关的数据。一个简单的例子可以只用两个 RTOS 任务 A 和 B 构建。任务 A 和 B 不应该相互交互,但是有一个 bug 是任务 A 可能不小心写入了一些任务 B 偶尔使用的数据,并覆盖了这个数据不影响任务 A 的正确操作。但是当任务 B 尝试使用损坏的数据时,任务 B 可能会意外失败。如果 MPU 没有配置为阻止任务 A 写入任务 B 的数据,这个 bug 可能需要嵌入式开发人员很长时间才能找到。如果错误很细微或任务 B 很少使用数据,则此问题特别难以解决。然而,对于 MPU,一个糟糕的写操作会立即导致一个异常,
在某些架构上,MPU 甚至可以帮助您检测 NULL 指针取消引用,因为您可以设置 MPU 区域以防止非特权代码访问 0x0 处的内存。
应用程序中设计良好的一组 MPU 区域可以显式保护重要的内存区域,以防止出现特定问题。一个很好的例子是通过将缓冲区放置在 MPU 区域的末尾来防止缓冲区溢出。您还可以将任务堆栈放置在任何非特权代码都无法访问的区域。如果这样做了,每个任务必须使用它自己的 MPU 区域之一来显式地授予自己访问自己的堆栈的权限。使用 MPU 会迫使您真正考虑应用程序的结构,以便在任务之间清晰地分离数据运行时错误无效的端口号,从而产生更健壮和可维护的代码库。
什么时候不使用MPU?
嵌入式开发人员在处理器上不使用 MPU 有两种主要情况;一个简单的项目和一个性能关键的项目。第一个很简单;一个非常简单的应用程序可能不会受益于使用 MPU 所增加的复杂性。如果不设置涵盖闪存、RAM 和外围设备的 MPU 区域,您的闪存演示可能已经准备就绪。
如果您需要处理器的每一点性能,使用 MPU 的开销可能会让您大吃一惊。使用 MPU 的 FreeRTOS 端口中的任务上下文切换例程更长,因为每个任务都有多个 MPU 区域要编程。当新任务进行上下文切换时,RTOS 必须对每个任务的 MPU 区域进行编程并执行其通常的职责,例如堆叠使用的寄存器。此外,由于内核代码和数据受 MPU 保护,所有内核函数调用都必须受到包装函数的保护。这个包装函数只是在调用内核函数之前提升处理器的特权级别运行时错误无效的端口号,然后恢复特权并返回。这不仅会增加运行代码所需的时间,而且还会增加任务所需的堆栈大小。任务的控制块还必须在其 MPU 区域中存储信息,
您还应该警惕使用 MPU 可能会很困难,有时会令人沮丧。嵌入式开发人员设计应用程序需要更多时间,因为必须为每个任务考虑 MPU 区域。这些区域中的错误,例如不正确的区域长度、权限或不正确链接的应用程序数据,可能会导致调试混乱。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网