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.

[参考译文] CCS/SW-EK-TM4C1294XL:TI-RTOS 对象视图(ROV)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/807651/ccs-sw-ek-tm4c1294xl-ti-rtos-object-view-rov

器件型号:SW-EK-TM4C1294XL
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

在运行 MEMORY_EX_TM4C1294XL_TI 示例之后。 我不理解如何解读结果或它们之间的关系:一个来自控制台、另一个来自 ROV。  

1).为什么它们在所有尺寸上彼此不同;

2) 2)为什么在 ROV 视图中、所有3种尺寸始终相同而不发生变化?

谢谢、

e2e.ti.com/.../different-sizes.docx

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

    ROV->HeapMem 的第一行是示例中未使用的系统堆。 第二行是任务1Fxn 使用的 HeapMem 堆。 我希望您在测试运行后查看 ROV。 第二个 HeapMem 是空闲的、最大的、在开始时为512、在分配期间会降低、但在释放所有分配的存储器后返回到这些级别。

    在建造第2个 HeapMem 之前、您在 main 中查看了 ROV。 因此、当您运行至完成时、ROV 中的数字会发生变化(因此、红色字母表示)。

    注意:task0Fxn 使用一个 HeaBuf 堆。

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

    感谢 Todd 的及时回应、但我仍然感到困惑、如下所示:

    1.如何分辨第一行是系统堆?  第一行是否始终是系统堆?  或.cfg 中的地址。 文件? 或者其他您可以快速知道它是系统堆的东西吗?

    2. ROV 能否在 totalSize、totalFreeSize 和 LargestFreeSize 之间显示不同的值?

    2.第2行被分配512字节、红色、这是我的第二个问题:1)为什么对于初始任务0堆状态和最终任务0堆状态、LargestFreeSize = 32?  我知道、初始值应该在为缓冲区分配内存之前、它应该是64、而不是32。  我们理解、"Final"应该是在内存被占用之后、它应该是32。

    问题2:花了几个小时来跟踪原始代码,最后在示例 memory_EK_TM4C1294XL_TI 中确定"argestFreeSize"是一个未命中的帧,它应该是"最大块大小",因为代码显示"stats->largestFreeSize=(obj->frenumBlocks>0)  ? obj->blocksize:0;"。

    4. ROV 是否有与问题3相同的问题、使用最大块大小作为最大可用大小?

    谢谢。

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

    [引用 USER="Neil Lu]1. 如何分辨第一行是系统堆?  第一行是否始终是系统堆?  或.cfg 中的地址。 文件? 或者您可以快速知道它是系统堆?[/quot]

    否 ROV 中的顺序是创建顺序。 我知道系统堆是静态创建的、因此它将首先创建。

    [引用 user="Neil Lu"]2. ROV 能否在 totalSize、totalFreeSize 和 LargestFreeSize 之间显示不同的值?[/quot]

    是的。 执行几次分配、您将看到相应的值发生变化。

    [引用 user="Neil Lu"]2. 第2行被分配了512字节、带红色、这是我的第2个问题:1)为什么对于初始任务0堆状态和最终任务0堆状态、LargestFreeSize = 32?  我知道、初始值应该在为缓冲区分配内存之前、它应该是64、而不是32。  我们理解、"最终"应该是在内存被占用之后、它应该是32。

    Task0正在使用 HeapBuf。 您正在查看 HeapMem。 看看 HeapBuf、这些值应该匹配。 HeapBuf 管理固定大小的缓冲器、因此最大的缓冲器是单个固定大小的缓冲器。 该示例创建大小固定为32的 HeapBuf (TASK0BUFSIZE)。

    [引用 user="Neil Lu"]3. 对于问题2,花几个小时来跟踪原始代码,最后在示例 memory_ek_TM4C1294XL_TI 中确定“LargestFreeSize”是一个未命中的帧,它应该是“最大块大小”,因为代码显示“stats->largestFreeSize  =(obj->numFreeBlocks >0)? obj->blocksize:0;".[/quot]

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

    尼尔

    上述回答是否回答了您的问题?

    Todd

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

    谢谢 Todd、我对您的回答感到满意、但对于这些术语仍有一些问题、这些问题非常令人困惑。  让我们看看  我得到的 HeapBuf 图片:  

    问题1:HeapBuf_constructe 创建了2个块 heapBuf。  块大小为32、但"numberAllocatedBlocks"为0、而不是2、因为我们知道它刚刚分配了2个堆缓冲区块。

    问题2.为什么"maxAllocatedBlocks" 0、而不是2或系统可以处理的其他一些数字?  这里的含义是什么?   

    谢谢、  

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

    您好、Neil、

    这是完整的构造代码

    #define HEAPBUFSIZE 64
    
    HeapBuf_Params_init (&heapBufParams);
    heapBufParams.blocksize = HEAPBUFSIZE / 2;
    heapBufParams.numBlocks = 2;
    heapBufParams.align = 8;
    heapBufParams.buf = heapBufBuffer;
    heapBufParams.HEapBufParams.pibuSize = HEapBufParams.HEapBufParams.buf
    HeapBuf_construct(&heapBufStruct,&heapBufParams, NULL); 

    因此、每个块都是32个字节、其中有2个字节。 注意:heapBufBuffer 为64字节。 我们会执行校准任务、以确保这适用于所有 TI 器件。  

    [引用 user="Neil Lu]Q1:HeapBuf_construction"创建2个块 heapBuf。  块大小为32、但"numberAllocatedBlocks"为0、而不是2、因为我们知道它刚刚分配了2个堆缓冲区块。

    当未分配块时、ROV 显示 numFreeBlocks = 2且 numberAllocatedBlocks = 0。 如果要分配一个块、您会看到数字变为  numFreeBlocks=1且 numberAllocatedBlocks=1。 分配后、它将为您提供一个32字节的块。

    [引用 USER="Neil Lu]Q2.为什么"maxAllocatedBlocks" 0,而不是系统可以处理的2个数字或其他一些数字?  这里的含义是什么?   [/报价]

    您需要启用此跟踪功能。 在.cfg 文件中将 HeapBuf.trackMaxAllocs 设置为 true。 我们将其默认为 false、以提高性能并最大程度地减小存储器。

    Todd

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

    谢谢 Todd 、我在 memory.cfg 文件中找不到 HeapBuf.trackMaxAllocs

    以下是唯一一个与 HeapMem 相关的代码

    /*========================= 应用程序特定实例========================= *
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    VAR HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');

    Neil

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

    您可以将其添加到.cfg 文件中(如果您将其作为文本文件进行编辑)

    HeapBuf.trackMaxAllocs = true;

    或者、如果您使用的是 XGConf、请单击黄色框 I 高光。 这会将该行添加到.cfg 中。

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

    谢谢 Todd、您绝对正确、是一个很好的资源。  我确实添加 了 HeapBuf.trackMaxAllocs = true;并得到结果!   

    ROV 似乎没有捕获任何错误。  我尝试将 TASK0NUMBUFS 更改为 5、这超出了 heapbuf 数字块4、我仍然分配了4个块、如图所示。

    #define TASK0BUFSIZE 32 /*分配大小*/
    #define TASK0NUMBUFS 5/*缓冲区数*/

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

    TASK0NUMBUFS 是在以下循环中执行的分配任务0的数量。 它不能超过堆中的块数。

    对于(i = 0;i < TASK0NUMBUFS;i++){
    bufs[i]= Memory_alloc (堆、TASK0BUFSIZE、0、NULL);
    }
    
    /*可用内存块*/
    对于(i = 0;i < TASK0NUMBUFS;i++){
    memory_free (heap、bufs[i]、TASK0BUFSIZE);
    }
    

    如果您尝试执行5、则会出现内存分配错误。 由于 alloc 未成功、maxAllocatedBlocks 不会增加。

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

    谢谢 Todd、以下是我在使用5时从程序本身而不是从 CCS 或 ROV 获得的结果:

    存储器示例已启动。

    初始任务0堆状态

    largestFreeSize = 32

    totalFreeSize = 128

    总大小= 128

    xdc.runtime.Memory:第52行:内存不足:堆=0x20001900、大小=32

    xdc.runtime.Error.raise:终止执行

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

    尼尔

    有道理。 您尝试从只有4个块的堆中分配5个块。 检测 NULL 被传递到 Memory_alloc 中、应用程序在失败时终止。 如果你已经将一个已初始化的 Error_block 传递到 Memory_alloc、那么 API 将返回一个 NULL。 注意:在任一种情况下、maxAllocated 保持在4、因为分配失败不会影响 maxAllocated 块。 注意:maxAllocated 是一个高水位标记、而不是您分配块的总次数。

    Todd

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

    谢谢、Todd、在示例 memory.c 中、这种感觉是对的吗?  1) 1)系统堆由 TI-RTOS 创建、仅供其使用? 2) 2)当使用 TI-RTOS 对应用程序进行编程时、应用程序只能构建用于应用程序的 heapBuf 和 heapMem 堆?  谢谢、  

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

    大家好、Todd、在这个初始 TI-RTOS 内存堆研究中、我得到4种堆类型:系统堆、HeapBuf、HeapMem 和 HeapTrack (smartHeap)。  我的猜测是对的吗?  系统堆由操作系统构建、仅供操作系统使用?  HeapBuf 和 HeapMem 由应用程序构建、用于应用程序?  HeapTract 由 ROV 工具使用、它用于从系统堆、HeapBuf 和 HeapMem 中收集堆使用信息?

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

    尼尔

    默认情况下、RTOS 会创建一个系统堆(也称为默认堆)。 默认情况下、内核会使用此功能。 它也可由应用程序通过 malloc 或 Memory_alloc (NULL、blah、blah、blah)来使用。  

    应用程序可以创建额外的堆。 它们可以是 HeapMem、HeapBuf 等类型 HeapTrack 位于另一堆堆堆之上。 例如、在视频中、我展示了如何将 HeapTrack 实例置于系统堆的顶部。 如果您希望 HeapTrack 实例位于另一个堆实例之上、则必须自行设置(例如创建 HeapBuf 实例、然后为 HeapTrack 实例创建的参数提供该句柄)。

    Todd

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

    谢谢 Todd、非常好的解释。   

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

    是否可以在 ROV 中监控系统堆?

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

    是的。 请查看 ROV->HeapMem (假设您使用了默认配置)。 如果您看到多个(这意味着您创建了多个)、则需要弄清楚哪一个是哪一个。

    Todd