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.

[参考译文] 编译器/TMDSEVM6678:如何增加用于 openmp 应用程序的 new/malloc 的堆内存?

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/898489/compiler-tmdsevm6678-how-to-increase-heap-memory-to-be-used-for-new-malloc-for-an-openmp-application

器件型号:TMDSEVM6678



















Thread 中讨论的其他器件:SYSBIOS
/*
版权所有(c) 2012-2015年,德州仪器公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*/


********* //*
段映射 */
********* /var
program = xdc.useModule('xdc.cfg.Program');

program.sectMap[".args"] = new Program.SectionSpec ();
program.sectMap[".bss"] = new Program.SectionSpec ();
program.sectMap[".cinit"] = new Program.SectionSpec ();
program.sectMap[".cio"] = new Program.SectionSpec ();
program.sectMap[".const"] = new Program.SectionSpec ();
program.sectMap[".data"] = new Program.SectionSpec ();
program.sectMap[".far"] = new Program.SectionSpec ();
program.sectMap[".fardata"] = new Program.SectionSpec ();
program.sectMap[".neardata"]= new Program.SectionSpec ();
program.sectMap[".rodata"] = new Program.SectionSpec ();
program.sectMap[".stack"] = new Program.SectionSpec ();
program.sectMap[".switch"] = new Program.SectionSpec ();
program.sectMap[".sysmem"] = new Program.SectionSpec ();
program.sectMap[".text"] = new Program.SectionSpec ();

//必须将这些段放在核心本地存储
器 program.sectMap[".args"].loadSegment 中 ="L2SRAM";
program.sectMap[".cio"].loadSegment ="L2SRAM";

//
在// OpenMP 中,以下数据段中的变量可能会被“共享”。 这些段必须放置在共享存储器中。
program.sectMap[".bss"].loadSegment ="DDR3";
program.sectMap[".cinit"].loadSegment ="DDR3";
program.sectMap[".const"].loadSegment ="DDR3";
program.sectMap[".data"].loadSegment ="DDR3";
program.sectMap[".far"].loadSegment ="DDR3";
program.sectMap[".fardata"].loadSegment ="DDR3";
program.sectMap[".neardata"].loadSegment ="DDR3";
program.sectMap[".rodata"].loadSegment ="DDR3";
program.sectMap[".sysmem"].loadSegment ="DDR3";

//内核共享的代码段-放置在共享存储器中以避免复制
program.sectMap[".switch"].loadSegment = program.platform.codeMemory;
program.sectMap[".text"].loadSegment = program.platform.codeMemory;

//调整默认堆栈的大小并将其放置在 L2SRAM
var deviceName = String (Program.cpu.deviceName);
if (deviceName.search("DRA7XX")=-1){program.stack = 0x20000;}
否则 {program.stack = 0x8000;}
program.sectMap[".stack"].loadSegment ="L2SRAM";

//由于没有参数传递给 main,因此将.args 大小设置为0
program.argSize = 0;


/************ /*
OpenMP 运行时配置*/********
//

在编译
中包含 OMP 运行时 var ompSettings = xdc.useModule("ti.runtime.openmp.Settings");

//如果应用程序使用 BIOS 组件或依赖 BIOS 组件,则设置为 true
ompSettings.usingRtsc = true;

if (ompSettings.usingRtsc)
{
/*为 BIOS 配置 OpenMP
*- OpenMP* configureCores (masterCoreId、numberofCoresInRuntime)
* 配置主内核的 ID 和内核数
* 运行时可用。
*

VAR OpenMP = xdc.useModule('ti.runtime.ompbios.OpenMP');

//配置主内核的索引和可用内核的数量
//到运行时。 内核是连续的。
OpenMP*主 CoreIdx = 0;

//根据器件设置内核数
如果 (deviceName.search("DRA7XX")!=-1){OpenMP*= 2;}
否则,如果(deviceName.search("6670")!=-1){ OpenMP*= 4;}
否则,如果(deviceName.search("6657")!=-1){ OpenMP*= 2;}
否则,如果(deviceName.search("K2L")!=-1){ OpenMP*= 4;}
其他 { OpenMP*= 8;}

//拉入 Platform.XDC 中描述的内存范围以配置运行时
VAR DDR3 = Program.cpu.memoryMap["DDR3"];
VAR DDR3_NC = Program.cpu.memoryMap["DDR3_NC";
VAR MSMC = Program.cpu.memoryMap["MSMCSRAM"];
var msmcNcVirt= Program.cpu.memoryMap["OMP_MSMC_NC_virt"];
var msmcNcPhy = Program.cpu.memoryMap["OMP_MSMC_NC_PHY"];

//使用内存范围信息初始化运行时间
if (deviceName.search("DRA7XX")=-1){
OpenMP* msmcBase = MSMC.base
OpenMP* msmcSize = MSMC.len;

OpenMP* msmcNoCacheVirtualBase = msmcNcVirt.base;
OpenMP* msmcNoCacheVirtualSize = msmcNcVirt.len;

OpenMP*。msmcNoCachePhysicalBase = msmcNcPhy.base;
}
其他
{
OpenMP*分配堆栈= true;
OpenMP*分配堆栈 FromHeapSize = 0x010000;

OpenMP* HASMsmc =错误;
OpenMP*版 NoCacheBase = DDR3_NC.base;
OpenMP*版。ddrNoCacheSize = DDR3_NC.len;
}

OpenMP*版 = DDR3.base;
OpenMP*文件大小 = DDR3.len;

//使用 HeapOMP 配置内存分配
// HeapOMP 句柄
//- BIOS 组件发出的内存分配请求(内核本地内存)
//-使用 IPC 模块启用共享内存分配
//从同一堆中分配内存的多个内核-由 malloc 使用
if (deviceName.search("DRA7XX")=-1){
VAR HeapOMP = xdc.useModule('ti.runtime.ompbios.HeapOMP');

//必须为 IPC 初始化共享区域0
VAR sharedRegionId = 0;

//内核本地堆的大小
VAR localHeapSize = 0x8000;

//所有内核共享的堆的大小
var sharedHeapSize = 0x08000000; 

//初始化共享区域并在 DDR3存储器区域中创建堆
VAR SharedRegion = xdc.useModule('ti.sdo.ipc.SharedRegion');
SharedRegion.setEntryMeta (sharedRegionId、
{base:dr3.base、
Len:sharedHeapSize、
ownerProId:OpenMP*。masterCoreIdx、
高速缓冲启用:true、
createHeap:true、
IsValid:true、
名称:"DDR3_SR0"、
});

//配置和设置 HeapOMP
HeapOMP.configure (sharedRegionId、localHeapSize);
}
其他
{
OpenMP.useIpcSharedHeap = false;
OpenMP*分配本地 HeapSize = 0x8000
OpenMP*分配共享 HeapSize = 0x00800000
}


VAR 启动= xdc.useModule('xdc.runtime.Startup');
startup.lastFxns.$add ('&_TI_omp_initialize_rtsc_mode');
}
否则
{
/*调整堆的大小。 必须将其放置在共享存储器中*
program.heap = sharedHeapSize;
}

一件事是,如果我更改共享堆大小,DDR3段中其他内容的起始地址不会更改...

此致

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

    遗憾的是、TI 的 OpenMP 解决方案不支持 C++。  请参阅 TI OpenMP 文档介绍页面末尾的注释

    谢谢、此致、

    乔治

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

    我理解,但我使用--openmp 标志编译 cppp 文件,但对于 c 文件,我设置了 omp 标志... 这不是应该这样做的吗? 因为代码编译和链接正常。

    如果我使用 malloc 该怎么办? 让我尝试更新...

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

    但是,我要更改 cfg 文件中的正确位置,以增加 malloc 函数使用的堆大小?

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

    [引用 user="Mike ITGeek">我理解,但我使用--openmp 标志编译 CPP 文件,但对于 c 文件,我设置了 omp 标志... 这不是应该这样做吗?[/引述]

    是的、这应该起作用。

    谢谢、此致、

    乔治

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

    [引用 user="Mike ITGeek"]但是,我要更改 cfg 文件中的正确位置,以增加 malloc 函数使用的堆大小?

    我不知道。  我将向 TI-RTOS 专家发送有关此主题的通知。

    谢谢、此致、

    乔治

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

    尊敬的 Mike:

    malloc()由 SYS/BIOS 提供。 它使用内核的默认系统堆(而不是编译器堆)。 我不熟悉 OpenMP 代码、因此我不确定上述配置对堆执行的操作。 如果您需要有关此内容的信息、我们可以将此主题移至处理器论坛。

    Todd

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

    您好 Todd、

    感谢您的意见... 我同意将 malloc()由 SYS/BIOS 处理;OpenMP 则根据 堆管理 API 提供另外两种类型的堆

    共享存储器(DDR 或 MSMC)中的堆

    2.本地存储器中的堆(L2SRAM)

    这不是我目前所关心的问题...

    我想、由于我通过 malloc/new 在 C++中进行所有内存分配、我只需要知道如何通过.cfg 文件调整 malloc (SYS/BIOS)堆的大小。 如果你能让我知道我如何在*。cfg 中调整 SYS/BIOS/malloc 堆大小(上面提供了 openmp 示例中的 cfg 示例)、这将非常有用、非常感谢。

    此外、如果您为我提供有关*。cfg 文件的详细信息的参考、这也会很有帮助。

    此外、需要知道我是否超大了 malloc 堆、链接器是否会抛出错误或某种警告?

    如果您认为处理器团队可以提供更好的帮助、请随时将该主题转发给他们。 但是,它似乎更多地与 TI-RTOS 相关... 因为我看到了 TI-RTOS 中讨论的以下主题... 总之,你们知道的更好:)

    https://e2e.ti.com/support/legacy_forums/embedded/tirtos/f/355/t/108589

    此致、

    更新了

     

    我认为它在...下有详细的描述。  SYS/BIOS (TI-RTOS 内核)用户指南(修订版 U)

    我会尝试并告诉你是否有任何事情… 在自我隔离的同时保持安全

    谢谢

     

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

    我似乎能够通过查看: SYS/BIOS (TI-RTOS 内核)用户指南(修订版 U)来解决这个问题。

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');

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

    BIOS.heapSize = 0x12000000;                  
    BIOS.heapSection ="systemHeap";

    但是,我想让一个 SYS/BIOS/TI-RTOS 的人对此也作评论,请.... (这对未来的新手也很有帮助)

    我还有一个问题 如何找到默认值 BIOS.heapSize?

    谢谢你