我正在使用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上分享我的代码
非常感谢
答案 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了解详情。