我需要用ARM Cortex M3/M4处理器的MPU实现一个多任务系统。
在该系统中,将有一个内核以特权模式管理资源,而以非特权模式管理用户应用程序。我想把用户应用程序从它的其余部分和系统资源中分离出来。因此,当我切换到一个新任务时,我释放了用户应用程序的堆栈和全局内存区域。它可以很容易地完成使用ARM皮质MPU寄存器。
但问题是,当发生上下文切换时,我还需要使用内核的一些全局变量。
例如,我在上下文切换期间调用一个函数来获取PendSV处理程序中的下一个TCB,但任务池不在用户应用程序区域内,并且它受到用户应用程序的保护。
所以,似乎应该有一个平衡,对吗?什么是安全有效的内存保护策略?
在调用Yield函数时,可以在上下文切换之前引发特权模式,但这似乎不是一个好的解决方案。
在这个问题上的总体策略是什么?也许您可以查看一下现有的开源实现,看看在那里做出了哪些设计决策。以FreeRTOS为例,它支持Cortex-M MPU;它可能不能直接回答你的确切问题,你可能必须检查源代码以获得完整的细节。
可以将数据内存划分为三个区域——用户区、内核区和共享区。