This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS:动态内存未发布

Guru**** 2611385 points
Other Parts Discussed in Thread: CC2650

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581730/rtos-dynamic-memory-not-released

Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

你(们)好。

我正在项目中使用 LaunchPAD-XL。

基本上、我使用 TI-RTOS 函数创建一个包含103个字符元素的动态数组:

memory_calloc( NULL,(SizeT)103,0,NULL );

执行某项操作后、我将使用以下命令删除动态阵列:

memory_free (NULL、memoryPointer、(SizeT) memorySize);


为了确保阵列被删除、我在 Memory_calloc 和 Memory_free 之前打印堆信息。

我意识到以下功能:

void OS_MemoryHeapInfoPrint (void)

Memory_Stats 统计数据;

Memory_getStats (NULL、&stats);

/* totalSize—堆的总大小(以 MADU 为单位)。
totalFreeSize—堆中可用存储器的当前大小(以 MADU 为单位)
largestFreeSize—当前最大连续自由块(在 MADU 中)*/

UART_PRINT ("[RTOS] TOTAL:%d - Free:%d - BISTAL:%d\r\n"、stats.totalSize、stats.totalFreeSize、stats.largestFreeSize);


在 UART 上、我看到堆可用存储器持续减少。

在 UART 上进行第一次迭代时、我看到:

[RTOS]总计:32768 -免费:25800 -最大值:25800
/*分配和免费*/
[RTOS]总计:32768 -免费:25344 -最大值:25344
在多次迭代之后、我看到:

[RTOS]总计:32768 -免费:13032 -最大值:13032
/*分配和免费*/
[RTOS]总计:32768 -免费:12576 -最大值:12576


为什么堆大小减小?

感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Federico、
    您的代码可能会在某个位置发生内存泄漏。 此外、当您分配103个字节(不是4的倍数)时、分配的实际缓冲区将稍微大一些。 对于 BIOS HeapMem、分配的数量将始终是 HeamMem 头数据结构的倍数、该数据结构通常为8个字节。
    您还可以使用 ROV 来监视堆使用情况。
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Janet、您好!

    我创建一个缓冲区大小为8192、对齐0、最小块对齐0的 HeapMem 实例。

    我使用这两个函数修改了我的代码:

    void* os_MemoryAlloc (uint16_t memSize)
    {
    return HeapMem_alloc (heapMemSDK、(SizeT) memSize、2、NULL);
    
    }
    
    void os_MemoryFree (void* pMemAddr、uint16_t memSize)
    {HeapMemMemMemMem_free(
    heapMemSDK、(PTR)Size*、(PTR)MemMemAddr、(PTR)SizeT))
    
    

    使用对齐= 2是否正确? 我阅读了一篇文章、其中 TI 员工建议使用2而不是0、因为 HeapMem 库中存在错误?

    此外、我使用一个使用 malloc 和 free 标准函数来分配缓冲区和结构的库。 HeapMem 是否会自动重定向 malloc 并释放给 HeapMem?

    感谢你能抽出时间

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Fede、

    只要是2的幂、就可以使用任何对齐。  我认为 HeapMem 中没有任何需要使用非零对齐的错误。  您能否发布指向您所引用的此帖子的链接?

    如果 BIOS.heapSize 非零且未使用 xdc.runtime.HeapStd、BIOS 将生成 RTS malloc()、free()等函数的可重入版本。

    您可以尝试通过将以下内容添加到.cfg 文件中、从而将断言添加到代码中:

    VAR 默认值 = xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断    = xdc.useModule('xdc.runtime.Diags');

    Defaults.common$.diags_ASSERT = Diags.always_on;

    这可能会帮助您跟踪问题。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Janet、您好!

    感谢您的回复。

    在对我的系统进行分析后、我决定使用 SystemHeap、因为我使用的外部库(不是我的)使用 malloc/free/realloc、并且没有办法用 TI-RTOS 动态分配函数替代这些函数。

    读取 SystemHeap、我读取它会自动重新映射 TI-RTOS 函数、例如 malloc/free/... 系统存储器功能。 是真的吗?

    需要我对代码进行一些修改、例如将其添加到 app.cfg 中?

    很抱歉、我不记得哪个帖子提到了内存对齐错误。

    感谢你能抽出时间。

    费德里科

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Federico、

    我不确定你所指的"堆"是什么。  它不是 TI-RTOS 内核(SYS/BIOS)的一部分。  的确、如果你不使用 HeapStd、SYS/BIOS 将把 malloc()、free()等映射到 xdc.runtime.Memory API。  您不需要向.cfg 文件中添加任何内容即可获得此映射。  将生成映射函数、您可以在生成的.c 文件中的项目的 package/cfg 文件下(或在 Debug/configPkg/package/cfg 下)找到这些函数。

    这里是我的 TI-RTOS PWM LED 示例中的一个示例。  我的工作区中的文件 pwmled_pem3.c

       pwmled_CC2650_LAUNCHXL_TI_CC2650F128/Debug/configPkg/package/cfg

    包含生成的 malloc()函数:

    /*
     * ==== malloc ====
     *
    void 属性*malloc (SizeT 大小)

       标头*packet;
       XDC_RAuntime_Error_Block EB;

       xdc_runtime_Error_init (&EB);

       如果(size = 0){
           返回(空);
       }

       数据包=(标头*) XDC_RAuntime_Memory_alloc (NULL、
           (SizeT)(size + sizeof (Header))、0、&EB);

       if (packet == NULL){
           返回(空);
       }

       packet->header.actualBuf =(ptr) packet;
       packet->header.size = size + sizeof (Header);

       返回(数据包+ 1);


    因此对 malloc()的任何调用都将转到该函数,该函数调用 Memory_alloc()。  memory_alloc()将使用 BIOS 堆 HeapMem 进行分配。  由于 HeapStd 使用 malloc(),因此我们不会生成 malloc()调用,因为这会导致无限递归。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、您好!
    感谢您的回复。
    是的、对于系统堆、我指的是 HeapMem。
    实际上、如果我打开 malloc 定义、我会获得使用 XDC_runtime _Memory_alloc (与您在上面发布的代码相同)的重新定义。

    感谢你能抽出时间。