程序员的知识教程库

网站首页 > 教程分享 正文

FreeRTOS——静态与动态内存分配(动态内存分配三种方式)

henian88 2025-04-10 22:52:41 教程分享 14 ℃ 0 评论

https://www.freertos.org/Static_Vs_Dynamic_Memory_Allocation.html

介绍

V9.0.0之前的FreeRTOS版本从特殊的FreeRTOS堆中分配下面列出的RTOS对象使用的内存。 FreeRTOS V9.0.0及更高版本使应用程序编写者可以自己提供内存,从而可以选择创建以下对象,而无需动态分配任何内存:

  • Tasks
  • Software Timers
  • Queues
  • Event Groups
  • Binary Semaphores
  • Counting Semaphores
  • Recursive Semaphores
  • Mutexes

使用静态还是动态内存分配是更可取的,取决于应用程序以及应用程序编写者的偏好。 两种方法都有优点和缺点,并且两种方法都可以在同一RTOS应用程序中使用。

位于FreeRTOS主下载目录的FreeRTOS / Source /
WIN32-MSVC-Static-Allocation-Only目录中的简单Win32示例演示了如何创建FreeRTOS应用程序而无需在项目中包含任何FreeRTOS堆实现。

使用动态分配的RAM创建RTOS对象

动态创建RTOS对象的好处是更加简单,并有可能最大程度地减少应用程序的最大RAM使用量:

  • 创建对象时,需要较少的功能参数。
  • 内存分配在RTOS API函数内自动进行。
  • 应用程序编写者不必自己担心分配内存。
  • 如果删除了RTOS对象使用的RAM,则可以重新使用该对象,从而有可能减少应用程序的最大RAM占用空间。
  • 提供RTOS API函数以返回有关堆使用情况的信息,从而可以优化堆大小。
  • 可以选择使用的内存分配方案来最佳地适合应用程序,例如,对于安全性至关重要的应用程序来说,heap_1.c为简化和确定性通常是必需的;heap_4.c为碎片保护; heap_5.c在多个RAM区域中拆分堆;或者应用程序编写者自己提供的一种分配方案。

如果
configSUPPORT_DYNAMIC_ALLOCATION设置为1或未定义,以下API函数将使用动态分配的RAM创建RTOS对象:

  • xTaskCreate()
  • xQueueCreate()
  • xTimerCreate()
  • xEventGroupCreate()
  • xSemaphoreCreateBinary()
  • xSemaphoreCreateCounting()
  • xSemaphoreCreateMutex()
  • xSemaphoreCreateRecursiveMutex()

使用静态分配的RAM创建RTOS对象

使用静态分配的RAM创建RTOS对象的好处是为应用程序编写器提供了更多控制权:

  • 可以将RTOS对象放置在特定的内存位置。
  • 可以在链接时而不是运行时确定最大的RAM占用空间。
  • 应用程序编写者无需关心内存分配失败的适当处理。
  • 它允许RTOS用于根本不允许任何动态内存分配的应用程序(尽管FreeRTOS包括可以克服大多数反对意见的分配方案)。

下列API函数(如果
configSUPPORT_STATIC_ALLOCATION设置为1时可用)允许使用应用程序编写器提供的内存创建RTOS对象。为了提供内存,应用程序编写者只需要声明一个适当对象类型的变量,然后将变量的地址传递给RTOS API函数即可。提供了StaticAllocation.c标准的演示/测试任务来演示如何使用这些功能:

  • xTaskCreateStatic()
  • xQueueCreateStatic()
  • xTimerCreateStatic()
  • xEventGroupCreateStatic()
  • xSemaphoreCreateBinaryStatic()
  • xSemaphoreCreateCountingStatic()
  • xSemaphoreCreateMutexStatic()
  • xSemaphoreCreateRecursiveMutexStatic()

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表