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/CC3200-LAUNCHXL:将 C malloc/free/realloc 重定向到系统堆

Guru**** 2611705 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/582789/rtos-cc3200-launchxl-redirect-c-malloc-free-realloc-towards-system-heap

器件型号:CC3200-LAUNCHXL

工具/软件:TI-RTOS

你(们)好。

我在 TI-RTOS 基础上构建了我的项目、并且我需要使用标准 C 函数 malloc、free 和 realloc。

我阅读 了 SYS/BIOS (TI-RTOS 内核) v6.46  -用户指南 、我了解系统会自动将 malloc/free/realloc 重定向到系统堆。 是这样吗?  

基本上、这就是我的情况:

  • 我使用 TI-RTOS 函数分配和释放内存以使用系统堆
    • memory_alloc( NULL,(SizeT) memSize,0,NULL );
    • memory_free (NULL,(PTR*) pMemAddr,(SizeT) memSize);
  • 我使用外部库(cJSON)来管理 JPN。 此库使用 malloc/free/realloc、我更喜欢避免代码更改。
    • 动态存储器将分配到何处? 堆中呢?

SYS/BIOS 和 TI-RTOS 是否相同?

查看 SYS/BIOS、我阅读了有关如何配置系统堆的示例:

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.heapSize = 0x900;
BIOS.heapSection ="systemHeapSap (系统堆)" 

我的"app.cfg  "文件以这种方式配置系统堆:

/*
* BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
//
//BIOS.heapSize = 0x8000;
Program.heap = 0x8000 




以下哪项是正确的声明? BIOS.heapSize 或 Program.heap? 我有点困惑。 谢谢!

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

    1. 显然、BIOS malloc 实现将调用具有 NULL 堆的 XDC_runtime 内存_alloc。 我想 BIOS 用一些合理的方法来替换默认堆、否则它将是 HeapStd、而后者又使用 malloc。
    2. 尽管如此,我还是非常确信 malloc/new/Memory_alloc (NULL,...) 都是从相同的全局堆分配的。
    3. SYS/BIOS (也称为 TI-RTOS 内核)只是 TI-RTOS 的一个组件(例如、请参阅此处: http://processors.wiki.ti.com/index.php/TI-RTOS)
    4. 据我所知、BIOS 堆大小设置(如果提供)将覆盖 Program.heap 设置。 当我同时指定这两个值时、我会收到一条 CCS 警告消息、提示"BIOS.heapSize 和 Program.heap 均已设置。 程序堆被忽略。 使用 BIOS.heapSize"。
    5. 我只使用 BIOS.heapSize。

    Markus

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

    Markus、您好!

    感谢您的回复、这有助于我更好地了解 TI-RTOS。

    我对使用 Memory_alloc 进行内存分配有疑问

    具体而言、我应该使用哪种对齐方式? 现在我使用了0。

    最好将存储器大小分配为8的倍数? 我在有关使用堆的动态存储器的帖子中阅读了这一点。

    这是因为、当我分配一个结构、然后我释放该结构时、一些存储器不会释放。

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为0应该是好的、它是满足所有基本 C 类型要求的对齐方式。
    您如何知道并非所有存储器都已释放? 您确定不会忘记释放在结构初始化期间分配的额外内存吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用以下代码在串行上打印可用的堆存储器:

    void OS_MemoryHeapInfoPrint (void)
    {
    Memory_Stats stats;
    
    /* totalSize—堆的总大小(在 MADU 中)。
    totalFreeSize—堆中可用内存的当前大小(在 MADU 中)*/
    
    Memory_getStats (system_heap_handle、&stats);
    uart_print ("[系统堆]总计:%d -空闲:%d \r\n"、stats.totalSize、stats.totalFreeSize);
    

    释放动态结构后、可用存储器减少16个字节。

    出于我的目的、在不需要高级动态存储器功能(如多个堆)的情况下、我可以使用 HeapStd 与 C 标准函数吗?

    如何实现这一点? 创建 HeapStd、然后使用 malloc/free? 或者我需要在 TI-RTOS 配置中指定一些内容吗?

    感谢您的观看!

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

    您好 Federico、

    如果只想使用 HeapStd、可以将类似如下的内容添加到.cfg 文件中:

    VAR HeapStd = xdc.useModule('xdc.runtime.HeapStd');
    VAR 内存= xdc.useModule('xdc.runtime.Memory');

    Memory.defaultHeapInstance = HeapStd.create ({size:1024});

    此致、

    Janet