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/TMS320C6654:选择 SYSBIOS 使用的堆

Guru**** 2558250 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/621007/rtos-tms320c6654-select-heap-used-by-sysbios

器件型号:TMS320C6654
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好!

我的项目中有一个放置在 DDR3中的大堆:

BIOS.heapSize = 262144;
BIOS.heapSection ="heap_section";

Program.sectMap["HEAP_SECTION"]= new Program.SectionSpec ();
Program.sectMap["HEAP_SECTION"].loadSegment ="DDR3";

我发现 SYSBIOS Hwi 将其调度表存储到堆中。 为了避免性能问题、我想要拆分堆、将一小部分放在 L2中、将大部分放在 DDR3中。 我已经创建了一个新堆并将其定义为默认堆。 我假设 SYSBIOS Hwi 将继续使用"BIOS 堆"、代码中的"new ()"将进入此默认堆、但 Hwi 也使用了此默认堆:

VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
var heapMemParams =新 HeapMem.Params;
heapMemParams.size = 262144;
heapMemParams.sectionName =".myHeap";
program.global.heap1 = HeapMem.create (heapMemParams);
Defaults.common$.instanceHeap = Program.global.heap1;

Program.sectMap["HEAP_SECTION"]= new Program.SectionSpec ();
Program.sectMap["HEAP_SECTION"].loadSegment ="L2SRAM";
Program.sectMap[".myHeap"]= new Program.SectionSpec ();
Program.sectMap[".myHeap"].loadSegment ="DDR3";

如何将 SYBIOS 分配的内存放入 L2中、将我分配的内存放入 DDR3中?

谢谢

(我使用 的是 SYSBIOS 6.46.00.23、xdctool 3.32.00.06、编译器7.4.16)

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

    我已将其转发给软件团队。 他们的反馈应发布在此处。

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

    是否有更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    吉尔达斯
    似乎您仍然只有一个堆"heap1"。 您确实在 L2中创建了一个段"heap_section"、但没有在那里分配任何堆。 您需要:
    (笑声)
    heapparams.sectionName ="heap_section";
    program.global.heap2 = HeapMem.create (heapparams);

    话虽如此、您能告诉我为什么您认为调度表是堆中的? 在我查看的一个示例中、我可以看到"dispatchTable"是 Hwi 的 Module_State 的一部分、这意味着它是静态定义的、应该在.data 或类似的地方。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了新的.myHeap 之外、我还保留了 BIOS 堆定义:

    BIOS.heapSize = 262144;

    BIOS.heapSection ="heap_section";

    两个堆都出现在我的映射文件中。

    我在 Hwi_dispatchCore 上放置了一个断点、并查看 CCS ti_sysbios_family_c64p_Hwi_Module_state__V 此结构包含类型为 ti_SysBIOS_c64p_Hwi_Object*的字段调度表[16]。 包含在值[5]到[12]中的地址(对应于我使用的中断)都与堆中的地址相对应:

    运行 origin load origin length init length atts members

    ------  ------ ------ ------ ---- ----

     9c68ee80  9c68ee80  00050000 00000000  rw- heap_section

    因此、不是堆中的调度表、而是调度表指向的对象

    Gildas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我假设您希望实际的调度表位于堆中、而不是 Hwi 实例中。
    所以、你有两个堆、可以将它们称为 Program.global.heap1和 Memory.defaultHeapInstance。
    如果你只想让 Hwi 实例进入缺省堆、你必须执行以下操作:
    Defaults.common$.instanceHeap = Program.global.heap1;
    Hwi.common$.instanceHeap = Memory.defaultHeapInstance;

    如果你希望一些其他模块的实例也进入 BIOS 堆、你必须像我对'Hwi'所做的那样指定它们的实例堆。

    您是否正在使用 C++? 如果是,我必须检查 new()会发生什么情况。 对 malloc()的调用进入 BIOS 堆,但我不知道 new()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在 DDR3中、Hwi 对象仍在堆中。 这是我的 cfg 文件的提取:

    BIOS.libType = BIOS.LibType_NonInstrumented;

    bios.cpufreq.lo = 850000000;

    BIOS.heapSize = 196608;

    BIOS.heapSection ="heap_section"

    BIOS.sertsEnabled = false

    BIOS.logsEnabled = false

    BIOS.clockEnabled = false

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

    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');

    var heapMemParams = HeapMem.Params;

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

    heapMemParams.size = 196608;

    heapMemParams.sectionName =".myHeap"

    program.global.heap1 = HeapMem.create (heapMemParams);

    Defaults.common$.instanceHeap = Program.global.heap1;

    Hwi.common$.instanceHeap = Memory.defaultHeapInstance;

    Program.sectMap["HEAP_SECTION"]= new Program.SectionSpec ();

    Program.sectMap["HEAP_SECTION"].loadSegment ="L2SRAM"

    Program.sectMap[".myHeap"]= new Program.SectionSpec ();

    Program.sectMap[".myHeap"].loadSegment ="DDR3"

     

    我不知道它是否对您有所帮助、但 Memory_getStats 告诉我 BIOS 堆中使用了854个字节。 我尝试评论 Hwi.common$.instanceHeap 定义、但我始终有854。 我不知道堆中放置了什么、但 Hwi objet 似乎不在这个堆中。

     

    是的、我使用的是 C++

     

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否检查代码片段中引用的 Hwi 是否是 ti.sysbios.family.c64p.Hwi 的引用? 您是否还可以发布.map 文件? 您还能在存储器浏览器中找到变量 ti_sysbios_堆_HeapMem_Object__table__V 并将其内容截屏吗? 这就是定义的堆所在的位置、它们的缓冲区地址应该在那里可见。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我之前使用的 var Hwi = xdc.useModule('ti.sysbios.hal.Hwi');

    我更改为  var Hwi = xdc.useModule('ti.sysbios.family.c64p.Hwi');、但它不会更改任何内容

    运行 origin load origin  length  init length atts members
    ------  ------ ------ ------ ---- ----
     0085b340   0085b340   00030000  00000000   rw- heap_section
     9c68ee80   9c68ee80   00030000  00000000   rw-.myHeap

    我可以将我的映射文件发送给您、但不想在此处发布

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经尝试过多种配置、找到了一种似乎可以满足我的需求的配置、但我不确定它是否干净。 我只是对堆进行监控时遇到问题。
    我以前使用过
    memory_getStats (BIOS_Module_heap(),统计数据);
    以获取堆栈的使用。 我已将其替换为
    memory_getStats (BIOS_Module_heap(),统计数据);
    HeapMem_getStats (heap1、&stats);
    但这2个函数现在返回堆的使用情况、我不知道如何获取 SYSBIOS 堆的使用情况

    我删除了 Hwi.common$.instanceHeap 定义、因为它从未更改任何内容。

    请就我的新配置(更改 defaut heap defitepon、更改堆大小、反向 RAM 中的堆分配)向我提供建议:
    BIOS.libType = BIOS.LibType_NonInstrumented;
    bios.cpufreq.lo = 850000000;
    BIOS.heapSize = 262144;
    BIOS.heapSection ="heap_section";
    BIOS.sertsEnabled = false;
    BIOS.logsEnabled = false;
    BIOS.clockEnabled = false;

    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    var heapMemParams =新 HeapMem.Params;
    heapMemParams.size = 2048;
    heapMemParams.sectionName =".myHeap";
    program.global.heap1 = HeapMem.create (heapMemParams);
    Defaults.common$.instanceHeap = Program.global.heap1;

    Program.sectMap["HEAP_SECTION"]= new Program.SectionSpec ();
    Program.sectMap["HEAP_SECTION"].loadSegment ="DDR3";
    Program.sectMap[".myHeap"]= new Program.SectionSpec ();
    Program.sectMap[".myHeap"].loadSegment ="L2SRAM";
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的新配置与您开始的配置没有什么不同、不同大小的配置除外。 您是否说 Hwi 实例现在位于 L2SRAM 中? 这似乎不可能通过改变堆大小来实现、但如果它能满足您的需求、那么它就很棒!
    至于堆统计数据、我必须让其他更熟悉该代码的人进行响应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对 BIOS_Module_heap ()的调用返回已经被模块 BIOS asigned 的堆、因为对 Default.common$.instanceHeap 的分配是'heap1'。 如果需要默认堆、则需要将 NULL 传递给 Memory_getStats:
    Memory_getStats (NULL、&stats);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的理解是:
    - C++ new ()仍然使用 BIOS.heap、而不是被定义为默认值的堆
    - Hwi 使用缺省堆来放置它的 objetcs
    因此、我已经改变了我的2个堆在内存中的位置并调整了大小(DDR3中的大容量、L2中的小容量)

    您的答案还可以帮助我获取两个堆的统计信息

    感谢你的帮助