FreeRTOS内存管理问题-tCB和任务栈是分配在MCU的栈还是堆上?

问题描述 投票:0回答:2

对于FreeRTOS中的heap_1实现,TCB和任务堆栈存储在微控制器的RAM中是什么意思?如果我查看代码,会创建一个静态分配的数组,其大小为 configTOTAL_HEAP_SIZE 宏。这个数组是在 bss 上分配的,因为它是外部的(我看到了映射文件)

所以从技术上讲,MCU 堆上没有存储任何内容,对吗?

每当我读到有关此的文章时,我都会感到困惑。我认为我们正在讨论的是 FreeRTOS 堆。内核将该静态数组视为堆,但它实际上存储在微控制器的 RAM 上,特别是数据部分?

c heap-memory freertos
2个回答
0
投票

我们正在讨论任务堆栈的分配位置。请记住,每个任务都需要自己的堆栈才能被任务调度程序抢占。

来自 https://www.freertos.org/a00125.html

每个任务都需要 RAM,用于保存任务状态并由任务使用 作为它的堆栈。如果使用 xTaskCreate() 创建任务,则所需的 RAM 会自动 从 FreeRTOS 堆分配。如果创建了任务 使用 xTaskCreateStatic() 那么 RAM 是 由应用程序编写者提供,因此可以在编译时静态分配。

据我了解,您可以静态和动态地为任务堆栈分配内存(取决于您如何创建任务)。请参阅https://www.freertos.org/xTaskCreateStatic.html


configTOTAL_HEAP_SIZE
是一个独立于任务堆栈讨论的概念。它定义了堆的大小(在任务之间共享),用于动态分配。


0
投票

所以从技术上讲,MCU 堆上没有存储任何内容,对吗?

不,MCU 对堆一无所知。堆是一个抽象的内存区域,可供动态分配函数使用。

每当我读到有关此的文章时,我都会感到困惑。我想这是 我们正在谈论的 FreeRTOS 堆。内核对待静态 数组作为堆,但它实际上存储在微控制器的 RAM 上, 特别是数据部分?

是的,这是一个大数组,可以防止链接器将此内存用于其他用途。它不必位于任何特定部分,您可以将其放置在您喜欢的任何部分。

这个数组是在bss上分配的,因为它是extern的(我看到了地图 文件)

正如我所写,它可以位于您喜欢的任何部分。

我认为你应该专注于学习如何使用 RTOS,而不是研究内部结构。获得更多的知识和经验,然后再回来。

© www.soinside.com 2019 - 2024. All rights reserved.