freeRTOS环境下public个变量的存储区

Storage area of public variables in a freeRTOS environment

全局 public 变量(未在任务主体内声明)存储在 FreeRTOS 环境中的什么位置?

系统中的内存大小配置将确保它们获得足够的(非重叠)space 用于存储,例如:

  1. configTOTAL_HEAP_SIZE定义在FreeRTOSConfig.h,或

  2. 链接描述文件中定义的这些参数:
    _Min_Heap_Size = 0x200; /* required amount of heap */ _Min_Stack_Size = 0x400; /* required amount of stack */

它们存储在全局内存中,但不是 "on the heap",因为 C 编译器不会生成对 FreeRTOS heap_x.c 的调用(其中 x 是其中之一堆实现编号)来分配此内存,它会简单地将其填充到正确的部分,链接器会将该部分定位在内存中的某个位置。

用作堆后备存储的内存通常也是相同的形式,即我们在 heap_2.c:

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

这只是声明一个全局变量,它是一个指定大小的数组;然后链接器会将其定位在实际内存中,就像任何其他变量一样。

这是假设一个基于闪存的平台,即 FreeRTOS 程序不是由某些代码在 运行 时动态 加载的平台,在这种情况下当然,该代码必须将程序的所有部分放入内存,并且可能确实为此分配了堆内存。

FreeRTOS 作为 C 源代码提供,作为项目的一部分与其他 C 源代码一起编译 - 因此除非您专门使用客户 linker 脚本(如果您使用的是支持内存保护的 FreeRTOS 版本)那么原始问题的答案是 - 存储所有内容的位置与未使用 FreeRTOS 完全相同,因为您的编译器只看到 C 代码。因此,就像在任何其他标准 C 程序中一样,您可以增加结构的大小,直到它们太大而无法适应您正在使用的 MCU - 您会知道什么时候是因为 [假设您的 linker 脚本是正确的] 该应用程序将不再 link。如果您看到这些结构被损坏,那是由于其他原因,例如堆栈溢出,而不是因为它们存储在错误的位置。一些可能有帮助的 link:
https://www.freertos.org/a00110.html#configASSERT
https://www.freertos.org/Stacks-and-stack-overflow-checking.html