兼容ARM Cortex-M3和Cortex-M4F标准移植。
可以创建以特权模式或非特权模式运行的任务。非特权任务只能访问它们自己的堆栈和最多三个用户可定义的内存区域(每个任务三个)。用户可定义内存区域是在创建任务时分配给任务的,如果需要,可以在运行时重新配置。
用户可定义的内存区域可以单独参数化。例如,一些区域可能被设置为只读,而另一些区域可能被设置为不可执行(在ARM术语中简称为XN),等等。
非特权任务之间不共享数据内存,但非特权任务可以使用标准队列和信号量机制相互传递消息。可以通过使用用户可定义的内存区域显式地创建共享内存区域,但是不建议这样做。
特权模式任务可以将自己设置为非特权模式,但一旦进入非特权模式,它就不能再将自己设置为特权模式。
FreeRTOS API位于Flash的一个区域,该区域只能在微控制器处于特权模式(调用API函数导致临时切换到特权模式)时访问。
内核维护的数据位于RAM的一个区域,只有在微控制器处于特权模式时才能访问。
系统外设只能在微控制器处于特权模式时访问。任何代码都可以访问标准外设(UART等),但是可以使用可定义的内存区域显式地对其进行保护。
FreeRTOS-MPU可以创建两种类型的任务:
特权任务:特权任务可以访问整个内存映射。特权任务可以使用xTaskCreate()或xTaskCreateRestricted() API函数来创建。
非特权任务:非特权任务只能访问它的堆栈。此外,可以授予它最多三个用户可定义内存区域的访问权限(每个任务三个)。非特权任务只能使用xTaskCreateRestricted()创建。注意,xTaskCreate()不能用于创建非特权任务。
如果一个任务想要使用MPU,那么必须提供以下附加信息:
🔹任务堆栈的地址。
🔹最多三个用户可定义内存区域的开始、大小和访问参数。
因此,创建任务所需的参数总数非常大。为了使创建MPU任务更容易, xTaskCreateRestricted()使用了一个名为xTaskParameters的参数结构体,通常定义为结构常量存储在Flash中,并将该结构地址作为单个参数传递给xTaskCreateRestricted()。