Thread 中讨论的其他器件:SYSBIOS
工具/软件:Code Composer Studio
在运行 MEMORY_EX_TM4C1294XL_TI 示例之后。 我不理解如何解读结果或它们之间的关系:一个来自控制台、另一个来自 ROV。
1).为什么它们在所有尺寸上彼此不同;
2) 2)为什么在 ROV 视图中、所有3种尺寸始终相同而不发生变化?
谢谢、
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.
工具/软件:Code Composer Studio
在运行 MEMORY_EX_TM4C1294XL_TI 示例之后。 我不理解如何解读结果或它们之间的关系:一个来自控制台、另一个来自 ROV。
1).为什么它们在所有尺寸上彼此不同;
2) 2)为什么在 ROV 视图中、所有3种尺寸始终相同而不发生变化?
谢谢、
感谢 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
您好、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
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