首先解释MPU,MPU具有很多含义,我们常见的含义是:MPU:内存保护单元,内存保护单元(本文所述内容); MPU:微处理器单元,微处理另外,有人可能会将其与MPU-6050等模块相关联。
因此,请勿混淆MPU。
嵌入式专栏1为什么使用MPU?如果开发嵌入式项目,由于某些原因,例如内存溢出或内存故障,造成重大经济损失或引起重大事故,则可以理解为什么需要使用内存保护单元(MPU)。
在嵌入式系统中使用内存保护单元(MPU)可以在开发的早期阶段检测到由内存引起的错误,从而节省了更多的开发时间。
同时,在项目后期修改错误或添加功能可以减少文档修改和测试所需的时间。
换句话说,使用MPU可以避免由于修改一个bug而导致多个bug(0产生1,1产生一切)的情况。
嵌入式专栏2 MPU如何实现内存保护简而言之,它可以保护与当前执行的代码无关的所有数据。
以RTOS任务A和B为例:任务A和B不应相互交换数据,但是会出现错误。
任务A可能会意外写入一些任务B偶尔使用的数据,这不会影响任务A的正确操作。
但是,当任务B尝试使用损坏的数据时,任务B可能会意外失败。
如果未将MPU配置为阻止任务A写入任务B的数据,则开发人员可能需要很长时间才能跟踪该错误。
如果错误很小,或者任务B很少使用数据,则将很难解决该错误。
但是,如果使用MPU,则将尽早发现该错误。
在某些体系结构上,MPU甚至可以帮助您检测NULL指针引用,因为您可以设置MPU区域以防止非特权代码访问内存0x0。
应用程序中一组精心设计的MPU区域可以很好地保护重要的内存区域,以防止出现特定的问题。
一个很好的例子是通过在MPU区域的末尾放置一个缓冲区来防止缓冲区溢出。
您还可以将任务堆栈放置在任何非特权代码都无法访问的区域中。
如果这样做,每个任务必须使用其自己的MPU区域之一来为其自身的堆栈设置其自己的访问权限。
嵌入式专栏3使用MPU的好处无论是操作系统还是裸机系统,如果没有能力防止对错误内存的恶意访问,该系统将面临严重的安全问题和安全漏洞的雷区。
所使用的内存保护单元(MPU)具有许多优点。
MPU通常允许您在特权或非特权模式下运行,并使用一组“区域”来表示。
确定当前正在执行的代码是否有权访问代码和数据。
每个区域都是一个连续的内存块,具有一组权限,对内存的特权和非特权访问。
与非特权代码的子集相比,特权代码通常可以访问大多数(但不是全部)内存。
在整个系统的操作中,这些区域不必相同。
可以根据每个任务修改MPU区域,并且每个任务可以具有自己的唯一区域集,这些区域在任务移至运行状态时进行配置。
这使您可以仅对需要代码和数据的任务设置访问权限。
使用MPU的嵌入式操作系统将在每次上下文切换期间管理每个任务的区域和特权级别。
例如,为RTOS的两个任务设置不同的内存保护区域:您能理解上图吗?闪存和内存区域受到单独保护。
两个全局保护区域:Flash的开头和RAM的开头;在Flash中,只有任务1可以访问一部分,而任务则不能访问该部分。
同时,在Flash的其他区域中,只有任务2是可访问的,而任务1无法访问。
如果这两个区域相互访问,将生成MPU故障。
在RAM区域的同一区域中,只能读取一个,只能写入一个。
如果未按约定执行操作,则MPU也将发生故障。
嵌入式专栏4什么时候不使用MPU?通常在两种情况下,您不能在处理器上使用MPU功能:一个简单的项目,一个对性能至关重要的项目,第一个很简单:一个非常简单的应用程序基本上不需要使用MPU,但是会增加系统复杂。
无需设置外围设备的内存保护,RAM和MPU区域,您就可以一目了然地找到错误。
具有高性能要求的第二个项目,在上下文切换期间设置内存保护和堆栈操作可能会影响系统的实时性能并导致系统异常。
这需要根据项目的实际情况来考虑,否则不使用