0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS-MPU特性说明

strongerHuang 来源:麦克泰技术 作者:麦克泰技术 2022-06-22 14:05 次阅读

MPU(Memory Protection Unit,内存保护单元)在 Cortex-M内核中是可选模块,带MPU的微控制器允许内存映射(包括Flash、RAM和外围设备)细分为若干区域,分别给每个区域分配不同的访问权限。

FreeRTOS-MPU是FreeRTOS针对MPU实现的一个安全版本,支持ARMv7-M(Cortex-M3, Cortex-M4 和 Cortex-M7)和ARMv8-M (Cortex-M23和Cortex-M33)内核的微控制器。 针对ARMv7-M的FreeRTOS移植存在两个版本,一个支持MPU,一个不支持。针对ARMv8-M只有一个移植版本,通过编译开关控制是否支持MPU。 FreeRTOS通过将任务分为特权和非特权运行模式和限制对RAM、外设、可执行代码、任务堆栈内存的访问,使得应用更健壮和安全。例如,防止代码从RAM中执行可以获得巨大的好处,因为这样做可以防止许多攻击向量,如缓冲区溢出漏洞或加载到RAM中的恶意代码的执行。 使用MPU必然会使应用程序设计更加复杂,首先必须确定MPU的内存区域限制并向RTOS进行描述,其次MPU限制应用程序任务可以做什么和不能做什么。

MPU的策略

创建一个将每个任务限制在其自己的内存区域的应用程序可能是最安全的,但它也是设计和实现最复杂的。通常最好使用一个MPU来创建一个伪进程和线程模型——允许线程组共享内存空间。例如,创建一个可被可信的第一方代码访问的内存空间,以及一个仅可被不可信的第三方代码访问的内存空间。

FreeRTOS-MPU特性

兼容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()。

typedef struct xTASK_PARAMTERS{  TaskFunction_t   pvTaskCode;  const signed char *  const pcName;  unsigned short   usStackDepth;  void *       pvParameters;  UBaseType_t    uxPriority;  portSTACK_TYPE * puxStackBuffer;  MemoryRegion_t  xRegions[ portNUM_CONFIGURABLE_REGIONS ];} TaskParameters_t;typedef struct xMEMORY_REGION{  void *pvBaseAddress;      /* 起始地址 */  unsigned long ulLengthInBytes;  /* 长度   */  unsigned long ulParameters;   /* 访问属性 */} MemoryRegion_t;
7d38d546-f1e4-11ec-ba43-dac502259ad0.png

分配给任务的内存区域可以使用vTaskAllocateMPURegions()来更改。

预定义区域和用户可定义区域

区域0~4被内核配置为可用的运行环境,其中:

运行状态的任务可以访问它自己的栈,但是所有其他的RAM只有当运行在特权模式时才可以访问。

只有当在特权模式下运行时,才能访问内核和系统外设所在的Flash内存区域。

Flash内存(除了内核所在的内存)和所有非系统外设(例如UART和模拟输入)都可以被特权和用户模式任务访问。

内核在每次上下文切换期间都会重新配置MPU,因此每个任务可以不同地定义其余三个区域。

区域起始地址和大小限制

MPU硬件强加了两个规则,区域起始地址和大小定义必须遵守:

1、区域大小必须是32字节到4G(包括)之间的二进制的2次方。例如,32字节、64字节、128字节、256字节等等都是有效的区域大小。

2、起始地址必须是区域大小的倍数。例如,一个配置为65536字节长的区域必须从能被65536整除的地址开始。

FreeRTOS-MPUAPI

1、xTaskCreateRestricted()xTaskCreate()的扩展版本,用于创建执行权限受限或者内存访问权限受限的任务。

xTaskCreateRestricted()需要xTaskCreate()使用的所有参数,加上四个额外的参数来定义三个任务特定的MPU区域和一个堆栈缓冲区。如果在普通函数参数列表中使用这个数量的参数会很麻烦,而且可能会大量使用堆栈空间。xTaskCreateRestricted()将一个指向xTaskParameters结构的指针作为其两个参数之一,第二个参数用于向创建的任务传递句柄,与xTaskCreate()参数相同。如果不需要任务句柄, pxCreatedTask可以设置为NULL。

portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition,

xTaskHandle *pxCreatedTask );

2、vTaskAllocateMPURegions()定义一组内存保护单元(MPU)区域,供受MPU限制的任务使用。如果创建任务时没有分配MPU区域,可以在运行时使用vTaskAllocateMPURegions()函数重新分配。

void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify,

const MemoryRegion_t * const xRegions );

3、特权模式任务可以调用portSWITCH_TO_USER_MODE()将自己设置为非特权模式。在非特权模式下运行的任务不能设置为特权模式。

原文标题:FreeRTOS MPU使系统更健壮!

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    6809

    浏览量

    147620
  • MPU
    MPU
    +关注

    关注

    0

    文章

    297

    浏览量

    48363
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
  • Cortex-M3
    +关注

    关注

    9

    文章

    268

    浏览量

    59161

原文标题:FreeRTOS MPU使系统更健壮!

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    mpu6500和mpu6000哪个好

    mpu6500和mpu6000各有优势。MPU6500和MPU6000是由英飞凌(InvenSense)公司开发的两种九轴惯性测量单元(IMU),它们集成了三轴加速度计、三轴陀螺仪和三
    的头像 发表于 12-27 17:52 1458次阅读

    FreeRTOS中断测试避坑指南

    任何调用中断安全FreeRTOS API函数的中断服务例程都可以使用的最高中断优先级。不要从任何优先级高于此的中断调用中断安全FREERTOS API函数(优先级越高,数值越低)。
    的头像 发表于 12-21 09:04 443次阅读
    <b class='flag-5'>FreeRTOS</b>中断测试避坑指南

    MPU-6000和MPU-6050产品说明

    mpu6050模块介绍 
    发表于 11-30 09:17 0次下载

    FreeRTOS的发展历史和技术演进

    在嵌入式系统的领域中,实时操作系统(RTOS)是非常重要甚至不可或缺的组成部分。FreeRTOS(Real-Time Operating System)是一款广泛使用的开源 RTOS,为嵌入式开发
    的头像 发表于 11-18 17:55 924次阅读

    FreeRTOS内存管理实现

    FreeRTOS是一个为嵌入式系统设计的开源实时操作系统。它提供了一个多任务内核和一系列功能,适合在资源受限的设备上管理实时任务和应用程序。FreeRTOS内存管理的关键方面之一是堆管理。
    的头像 发表于 10-10 16:17 499次阅读
    <b class='flag-5'>FreeRTOS</b>内存管理实现

    在STM32F103单片机上移植FreeRTOS

    移植 FreeRTOS 以正点原子的跑马灯工程为基础,在上面扩展。在基础工程中新建一个名为 FreeRTOS 的文件夹: 创建 FreeRTOS 文件夹以后就可以将 FreeRTOS
    的头像 发表于 09-28 14:39 1172次阅读
    在STM32F103单片机上移植<b class='flag-5'>FreeRTOS</b>

    FreeRTOS任务与协程介绍

    。 协程是为那些资源很少的 MCU 准备的,其开销很小,但是 FreeRTOS 官方已经不打算再更新协程了。 任务特性: 1、简单。 2、没有使用限制。 3、支持抢占 4、支持优先级 5、每个任务都拥有堆栈导致了 RAM 使用量增大。 6、如果使用抢占的话的必须仔细的考虑
    的头像 发表于 09-28 11:02 543次阅读

    Freertos栈检测

    RTOS的环境开发中,栈的溢出检测是一个重要的工作。栈溢出检测我们可以借助硬件的MPU等实现,也可以使用软件检测。这里分享Freertos中的实现。这里基于Cortex-M4硬件平台,一些具体的代码就未贴出了,顺便介绍了一下Cortex-M4栈相关的基础知识。
    的头像 发表于 09-19 14:03 1083次阅读
    <b class='flag-5'>Freertos</b>栈检测

    ch32v307移植freertos

    是一款免费的RTOS,旨在使嵌入式系统的开发更加简单和高效。它为程序员提供了许多有用的特性和API,使得在嵌入式系统中开发复杂的多线程应用程序变得更加容易。 但是,对于那些已经习惯了使用某些RTOS的人来说,将开发环境转移到新的RTOS可能存在一些问题。尤其在移植FreeRTOS
    的头像 发表于 08-22 15:53 775次阅读

    基于STM32的FreeRTOS开发(1)----FreeRTOS简介

    FreeRTOS 是一个免费和开源的实时操作系统,它主要用于嵌入式系统。它非常轻量级,可以在很小的硬件资源上运行,因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务
    的头像 发表于 07-27 09:49 882次阅读
    基于STM32的<b class='flag-5'>FreeRTOS</b>开发(1)----<b class='flag-5'>FreeRTOS</b>简介

    RA FreeRTOS任务创建

    随着嵌入式应用程序变得越来越复杂,单片机裸机开发已经无法满足工程师对于复杂程序的需求。于是具有多任务调度和实时响应特性的RTOS便越来越受工程师们青睐。瑞萨RA系列MCU兼容FreeRTOS系统
    的头像 发表于 07-12 10:00 202次阅读
    RA <b class='flag-5'>FreeRTOS</b>任务创建

    MPU是什么 MPU的功能

    MPU(Memory Protection Unit)是一种硬件保护机制,用于保护嵌入式系统中的内存安全。它是嵌入式处理器中的一种特殊模块,通常与CPU一起集成在同一个芯片上。MPU的主要功能是限制程序对特定内存区域的访问权限,从而防止程序对系统中关键数据的非法访问,提高
    的头像 发表于 06-12 17:43 1.1w次阅读

    FreeRTOS简介及FreeRTOS源码包组成结构

    FreeRTOS 是市场领先的面向微控制器和小型微处理器的实时操作系统 (RTOS),与世界领先的芯片公司合作开发。
    的头像 发表于 06-09 14:21 4133次阅读
    <b class='flag-5'>FreeRTOS</b>简介及<b class='flag-5'>FreeRTOS</b>源码包组成结构

    FreeRTOS教程.pdf

    安富莱_STM32-V4开发板_FreeRTOS教程(V1.0).pdf
    发表于 05-09 14:08 106次下载

    MRC、MPU、MMU在用途或特性上的区别?以及优缺点?

    资源域控制模块(XRDC)中有一个MRC, 我想知道MRC、MPU、MMU在用途或特性上的区别?以及优缺点?
    发表于 05-06 07:51