STM32 FreeRTOS lwIP堆/堆栈/内存管理

STM32 FreeRTOS lwIP堆/堆栈/内存管理,stm32,freertos,lwip,Stm32,Freertos,Lwip,我正在使用STM32F107VCT处理器制作定制板。我正在使用FreeRTOS和lwIP 我正在使用tinyxml2库,读/写EEPROM,遇到奇怪的损坏问题和崩溃。我怀疑我的内存可能快用完了。我是一个新的嵌入式电子和FreeRTOS,所以我不确定我应该去哪里找 我创建了几个线程,如下所示: osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 512); defaultTaskHandle = osThreadCrea

我正在使用STM32F107VCT处理器制作定制板。我正在使用FreeRTOS和lwIP

我正在使用tinyxml2库,读/写EEPROM,遇到奇怪的损坏问题和崩溃。我怀疑我的内存可能快用完了。我是一个新的嵌入式电子和FreeRTOS,所以我不确定我应该去哪里找

我创建了几个线程,如下所示:

osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 512); 
defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
osThreadDef(RfTask, StartRfTask, osPriorityNormal, 0, 700); 
RfTaskHandle = osThreadCreate(osThread(RfTask), NULL);
osThreadDef(DiscoveryTask, StartDiscoveryTask, osPriorityNormal, 0, 256); 
DisoveryTaskHandle = osThreadCreate(osThread(DiscoveryTask), NULL);
下面是我的一些与堆/堆栈相关的定义

FreeRTOS.h 
define configTOTAL_HEAP_SIZE ((size_t)1024*24)

Flash.id
_estack = 0x20010000; /* end of RAM */
_Min_Heap_Size = 0; /* required amount of heap */ 
_Min_Stack_Size = 0x200; /* required amount of stack */
在我的脑海中,我并没有真正了解堆/堆栈理论是什么,以及它与flash.id和FreeRTOS.h中的数字的关系

有人能给我一个解释,这一切是如何工作的,以及任何方法来检查的任务可用内存量等

如果需要,我可以在gitlab上共享我的代码


非常感谢

我无法评论您的lwIP配置是如何使用内存的,但就FreeRTOS而言:

只有在构建中包含heap_3.c时,链接器脚本定义的堆才会被FreeRTOS使用。FreeRTOS附带的所有其他堆实现都从静态分配的数组中获取内存。如果所有内存分配都是使用FreeRTOS内存分配器完成的,那么在链接器脚本中定义堆就是在浪费RAM,因为它不会被使用。有关更多信息,请参阅

[在STM32上]由链接器脚本定义的堆栈将在调度程序启动前由main()使用,并在调度程序启动后中断。FreeRTOS任务不使用该堆栈,因为每个任务在创建时都分配了自己的堆栈。有关xTaskCreate()和xTaskCreateStatic()API函数,请参阅API文档

在开发时,建议确保定义了configASSERT(),并且启用了堆栈溢出检测。谷歌搜索这些术语以及“FreeRTOS”也会找到这些术语的链接

有什么方法可以检查任务可用的ram量等

在FreeRTOS中,每个任务都有一个名为
TCB\u t
的数据结构,用于存储自己的任务控制块(TCB),
TCB\u t
的一个结构成员是
pxStack
,表示任务堆栈内存的最低地址位置。在STM32中,堆栈内存(也是指针
$sp
)从高内存向下增长,如果
$sp
低于
pxStack
,则发生堆栈溢出

要检查特定任务可用的堆栈内存,只需检查
pxStack
$sp
的值(例如通过OpenOCD/GDB),并查看它们的差异

你可以详细阅读