【问题标题】:STM32 FreeRTOS lwIP Heap / Stack / Memory ManagementSTM32 FreeRTOS lwIP 堆/栈/内存管理
【发布时间】:2018-02-17 04:42:54
【问题描述】:

我正在使用 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 上分享我的代码

非常感谢

【问题讨论】:

    标签: stm32 freertos lwip


    【解决方案1】:

    有什么方法可以检查任务等可用的内存量吗?

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

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

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

    【讨论】:

      【解决方案2】:

      无法评论您的 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”也会找到这些术语的链接。

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 1970-01-01
        • 2020-10-10
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 2015-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多