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/CC2650:HeapBuff 块大小问题

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

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/594916/rtos-cc2650-heapbuff-block-size-question

器件型号:CC2650

工具/软件:TI-RTOS

您好!

我已阅读内核用户指南- HeapBuff 部分。 它的读数为"在指定这些运行时参数时要小心。 blocksize 需要是最坏情况结构对齐大小的倍数。 bufSize 应该等于 blocksize * numBlocks。 最坏情况下的结构对齐取决于目标。 在具有32位架构的器件上、使用8字节对齐。 缓冲区的基地址 也应该与这个相同的大小对齐。"

我在 CC2650上运行、并假设它也使用"8字节对齐"[请对此进行评论]。 据我所知、MCU 将使用一个字符数组作为堆、在本例中、它将为1280字节宽(请参阅下面的代码)。 我不明白为什么必须选择块大小、 但我认为这意味着这个特定的代码是由一个用户编写的、该用户希望写入10个大小为128字节的对象-我假设这是因为我们谈到 HeapBuf、我们必须已经知道我们将要写入的数据的大小 (哪个应该对应于块大小?)。 如果我的假设不正确、请向我解释、因为我不理解为什么 必须分配块的数量才能开始。

最后、为了考虑"最坏情况下的结构对齐"、我们是否应该为 CC2650系统创建8的倍数的块大小? 感谢你的帮助!

HeapBuf_Params PRM;
static char buf[1280];
HeapBuf_handle 堆;
Error_Block EB;

Error_init (&EB);
HeapBuf_Params_init (&PRMS);
PRM.blocksize = 128;
PRM.numBlocks = 10;
PRM.buf =(ptr) buf;
PRM.bufSize = 1280;
Heap = HeapBuf_create (&PRMS、&EB);
if (heap = NULL){
System_abort ("HeapBuf create failed");
} 

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

    HeapBuf 管理 N 个大小为 M 的固定大小缓冲器。在内部、我们只执行免费块的链接列表。 这可以实现快速分配和释放。 它还消除了外部碎片。 可能存在内部碎片(例如、固定大小的块为32字节、您请求的是24字节)。 因此、创建时必须指定块数和大小。 然后、创建程序将获取所提供的缓冲区并将块切片并将其粘贴到链接列表中。

    HeapMem (这是默认为您创建并在 malloc 和 Memory_alloc (NULL、…)中使用的堆类型) 是一个可变大小的堆。 使用这个堆、你只需提供一个缓冲区和缓冲区的大小。

    在 CC26xx (和所有 CortexM 器件)上、最坏情况下的数据类型对齐为8字节(例如双字节、长双字节和长长整型)。 由于 HeapBuf 不知道要在分配的缓冲区中放置什么、因此它假定情况更糟、并且需要对齐来处理所有内容。

    我们有 Memory_getMaxDefaultTypeAlign() API。 您可以使用此值代替运行时代码的硬编码值。

    注意:只有当分配的块大小大致相同时(例如64、48、54等)、才应使用 HeapBuf。 如果您的尺寸不同、则不会使用它。 在这种情况下、我建议使用 HeapMem (或默认堆)或 HeapMultiBuf (它管理 N 个固定大小块池)。

    注意:我们强烈建议您不要直接调用 HeapBuf_alloc。 您应该浏览内存模块。 它执行一些参数检查和对齐调整。 例如,您可以调用 Memory_alloc (myHeapHandle,...)。

    我希望这对我们有所帮助、而不仅仅是混淆了一切:)

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

    您好!

    感谢您的全面回答。 我想让你跑一些东西。 我正在使用 c 实现自己的链接列表(使用 HeapBuf)、充当节点的结构包含2个长数据类型和指向下一个值的指针。 这相当于一个14字节的大小。 由于系统是8字节对齐的、那么创建一个大小为16的 M 块的缓冲区是否安全、并且在每个块中、我将只使用16字节中的14字节。 正如您提到的、这将导致块的内部碎片、但我认为它是不相关的、因为当我释放块时、它将取消分配16个字节(包括14个字节)、并让我保留16个空闲字节来重新写入。 这有道理吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没关系。 注2长整型、对于 ARM 器件、指针为12字节。 此外、我们在内核中有一个队列模块。 它是一个双链接的列表(next 和 prev 指针)。