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

时间:2017-09-08 09:40:33

标签: stm32 freertos lwip

我正在使用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中的数字的关系

有人可以向我解释一下这一切是如何运作的,以及检查可用于任务的ram数量等的任何方法吗?

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

非常感谢

2 个答案:

答案 0 :(得分:0)

不能评论你的lwIP配置如何使用内存,但就FreeRTOS而言:

如果在构建中包含heap_3.c,则链接器脚本定义的堆仅供FreeRTOS使用。 FreeRTOS附带的所有其他堆实现都从静态分配的数组中获取内存。如果使用FreeRTOS内存分配器完成所有内存分配,那么在链接器脚本中定义堆就会浪费RAM,因为它不会被使用。有关详细信息,请参阅http://www.freertos.org/a00111.html

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

在开发时,建议确保定义了configASSERT(),并且已启用堆栈溢出检测。在" FreeRTOS"上搜索这些条款也会找到那些链接。

答案 1 :(得分:0)

  

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

在FreeRTOS中,每个任务都有一个名为TCB_t的数据结构,用于存储其自己的任务控制块(TCB),TCB_t的一个结构成员为pxStack,它表示该任务的最低地址位置任务的堆栈内存。在STM32中,堆栈内存(也就是指针$sp)从高内存中逐渐减少,如果$sp低于pxStack,则会发生堆栈溢出。

要检查可用于特定任务的堆栈内存,您只需检查pxStack$sp的值(例如通过OpenOCD / GDB)并查看它们之间的区别。

您可以阅读task.c了解详情。