C语言 freeRTOS环境中公共变量的存储区域

wyyhbhjk  于 2023-04-29  发布在  其他
关注(0)|答案(2)|浏览(364)

在FreeRTOS环境中,全局公共变量(不在任务体中声明)存储在哪里?
系统中的内存大小配置将确保它们获得足够的(非重叠)存储空间,如:

  1. FreeRTOSConfig中定义的configTOTAL_HEAP_SIZE。h,或
    1.链接器脚本中定义的这些参数:
    _Min_Heap_Size = 0x200; /* required amount of heap */ _Min_Stack_Size = 0x400; /* required amount of stack */
nwo49xxi

nwo49xxi1#

它们存储在全局内存中,但不是“在堆上”,因为C编译器不会生成对FreeRTOS heap_x.c(其中x是堆实现编号之一)的调用来分配内存,它只会将其放入正确的部分,链接器会将该部分放置在内存中。
用作堆的后备存储器的存储器通常也具有相同的形式,即:例如,我们在heap_2.c中有:

static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

它只是声明一个全局变量,该变量是一个指定大小的数组;然后,这将由链接器定位在实际存储器中,就像任何其他变量一样。
这是假设基于闪存的平台,即:也就是说,FreeRTOS程序不是在运行时被一些代码 * 动态 * 加载的,在这种情况下,当然代码必须将程序的所有部分装入内存,并且可能确实分配堆内存来这样做。

sr4lhrrt

sr4lhrrt2#

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

相关问题