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.

[参考译文] TMS320C6678:OpenMP* allocateStackFromHeap 和 OpenMP* allocateStackFromHeapSize 有何作用? 它与 program.stack 有何不同?

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/918065/tms320c6678-what-do-openmp-allocatestackfromheap-and-openmp-allocatestackfromheapsize-do-how-is-it-different-from-program-stack

器件型号:TMS320C6678

大家好、  

我最近一段安静的时间一直在使用 OpenMP 应用程序。 我一直在使用以下 cfg 文件。

C:\ti\openmp_dsp_c667x_2_06_03_00\packages\examples\hello_with _make\omp_config.cfg

代码中有一个段用于设置

OpenMP*分配堆栈= true;

OpenMP*分配堆栈 FromHeapSize = 0x010000;

我在下面的代码中不完全理解上述内容、我希望专业人士对此提供意见。 它到底做了什么、它可以用作 program.stack 的替代方案吗?? 此设置是否适用于 TMDSEVM6678LE。

我期待转发任何评论。

谢谢

//使用内存范围信息初始化运行时间
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;
}

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

    器件型号:TMS320C6678

    工具/软件:TI C/C++编译器

    大家好、

    我正在尝试为 OpenMP 应用生成随机数。

    有一点、我知道随机数生成需要一个种子、它恰好是一个全局变量、使 Rand 函数不安全、这对 OpenMP 多线程应用不安全。  我知道 POSIX 提供了一个线程安全版本的 rand、称为 rand_r、该版本已过时、更适合 drand48系列函数。

    请告诉我 OpenMP 应用是否有任何替代方案。  

    此致、

    Mike

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

    器件型号:TMS320C6678

    大家好、

    我正在阅读如何使用 makefile (此处)构建 OpenMP 应用程序,其中有一部分内容是:

    "如果应用程序使用 BIOS 或其他 RTSC 模块、则将 USE_BIOS 设置为1、否则设置为0 "

    但我不确定我的应用程序是否需要 BIOS 或其他 RTSC 模块?  我知道、我们迟早需要 EDMA 功能。

    请告诉我...

    此致

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

    器件型号:TMS320C6678

    大家好、

    我正在编译和构建 OpenMP hello 字示例并进行了一些修改。 我收到了低度的警告,但我不知道这意味着什么... 我在优化编译器手册中找不到这些部分...  

    警告#10247-D:在没有 SECTIONS 规范的情况下创建输出段".tbss"
    警告#10247-D:在不使用 SECTIONS 规范的情况下创建输出段".tdata"

    请告诉我代码 tbss 和 tdata 的哪个部分代表...

    我还阅读了以下主题  

    https://e2e.ti.com/support/processors/f/791/t/495007?-ProcessorSDK-OpenMP-tdata-and-tbss-sections

    因此、我更改了 cfg 文件并添加了两个段、并将它们分配给 DDR3、从而使 linker.cmd 反映更改

    但是,警告仍然存在... 请告诉我这些部分是什么... 我看到了以下描述、但仍然不确定这意味着什么。

    https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/specialsections.html

    任何评论都非常感谢。

    此致

    omp_config.cfg

    /*
    版权所有(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[".tdata"] = new Program.SectionSpec ();
    program.sectMap[".tbss"] = 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[".tdata"].loadSegment ="DDR3";
    program.sectMap[".tbss"].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;}
    // if (deviceName.search("DRA7XX")==1){program.stack = 128*1024;}
    // if (deviceName.search("DRA7XX")==1){program.stack =(512-20)*1024;
    否则} {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;
    }
    

    linker.cmd

    /*
    请勿修改此文件;它是从
    ti.targets.elf 软件包中的模板* linkcmd.xdt 自动生成的、将被覆盖。
    */
    
    *
    将''放置在路径周围、因为如果没有这一点、链接
    器*会将'-'视为减号运算符、而不是文件名字符。
    */
    
    
    -l"C:\users\Mehdi-laptop\workspace_v9_2\test_omp_recursion\Debug\configPkg\packages/ti\omp_config_pe66.oe66"-l"C:\ti\openmp_dsp_c667x_2_06_00\packages\cti\ti\runtime_bios\tid_ipoti_06\t\tid_ipoti_m\v06\t_ip_us\v06\t_ipot_ipt\t\t\t\t\t\t\v6_ip_ipt\v06\t_em_em_ip_06\t\t\t\t\t\t\v6_emb\v6_emb\v06\t_ip_ip_ip_em_emb\v06\t\t\v06\t\t\v06\t_ip_ip_ip_emb\v06\t\t\t\t\v06\t_emb\t\v06.micro
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    L2SRAM (RW):org = 0x800000,len = 0x60000
    OMP_MSMC_NC_virt (RW):org = 0xa0000000,len = 0x20000
    OMP_MSMC_NC_PHY (RW):org = 0xc000000,len = 0x20000
    MSMCSRAM (rwx):org = 0xc020000,len = 0x3e0000
    DDR3 (rwx):org = 0x80000000,len = 0x20000000
    }
    
    //*
    所有已加载软件包的链接器命令文件贡献:
    */
    
    *来自 xdc.services.global 的内容(空):*/
    
    //*来自 XDC 的内容(空):*/
    
    //*来自 XDC.corevers 的内容(空):*/
    
    *//来自 XDC.ROV 的内容
    
    xdc.runtime (空): //
    
    xdc.rov.runtime 中的*//*内容(空):*//
    
    //*来自 XDC.shelf 的内容(空):*//
    
    *来自 xdc.services.spec 的内容(空):*//
    
    *来自 xdc.services.intern.xsr 的内容(空):*//
    
    //*来自 xdc.services.intern.gen 的内容(空):*//
    
    //*来自 xdc.services.intern.cmd 的内容(空):*//
    
    //*
    
    来自 XDC.bld 的内容(空): //
    
    *来自 ti.targets.elf 的内容(空)://
    
    //*来自 ti.targets.rts6000的内容(空)://
    
    *来自 ti.runtime.rts6000
    
    
    
    
    
    
    
    
    
    xdc.runtime.knl 的内容(空):////*来自 ti.runtime.argsmain 的内容(空):////////*来自 ti.csl 的内容(空)://////////*来自 ti.sysbios.interfaces 的内容(空)://*/*。
    
    ti.sdo.ipc.interfaces 中的*/*内容(空):*/
    
    * xdc.services.getset 中的内容(空):*/
    
    *来自 ti.sdo.ipc.family 的内容(空):*/
    
    *来自 ti.sysbios.family.c62的内容(空):*/
    
    //来自 ti.sysbios.family.c64p.tci6488的内容(空)
    
    
    
    */ ti.runtime.device
    
    *// openmsdrmscmd:*/(空)*/*来自 ti.runtime.openmp:// */
    
    
    
    
    SECTIONS
    {
    /*
    * RTSC 生成的"C"文件(AppName)的.far 和.fardata 段
    *和 RTS 库(* rts*。lib)包含必须执行的全局变量
    *每个内核都是本地的。 因此、这些段放置在中
    每个内核的本地存储器。
    *
    .localfar:
    {
    "* rts*。lib"(.far)
    "* rts*。lib"(.fardata)
    "ti.drv.qmss*.ae66"(.far:local)
    "OMP_CONFIG_PE66.oe66"(.far)
    "OMP_CONFIG_PE66.oe66"(.fardata)
    
    } > L2SRAM
    
    
    /*
    *放置.TI.TLS 段以避免与相关的链接器缺陷
    *默认放置。 由于运行时、不使用此段
    *动态分配 TLS。
    *
    TI.TLS > DDR3
    
    /* TLS_INIT 必须放置在尚未通过 MPAX 映射的区域中
    因为它由加载程序初始化
    *
    .TI.TLS_INIT > DDR3
    }
    
    段
    {
    tomp_gvMem: load= L2SRAM、fill = 0x0
    
    qms: load= OMP_MSMC_NC_PHY、run= OMP_MSMC_NC_virt、fill = 0x0
    tomp_svNcMem: load= OMP_MSMC_NC_PHY、run= OMP_MSMC_NC_virt、fill = 0x0
    
    tomp_svMemSlow:load= DDR3
    }
    
    // ti.catalog.c6000中的内容(空):*/
    
    * ti.catalog 中的内容(空):*/
    
    * ti.catalog.peripherals.hdvicp2中的内容(空):*/
    
    //* xdc.platform 中的内容(空):*/
    
    //* xdc.cfg 中的内容(空):*/
    
    //* ti.platforms.generic 中的内容(空):*/
    
    */*(空) ti.runtime.openmp.platforms.evm6678中的内容(空): ti.sysbios
    
    的*/*内容(空):*/
    
    * ti.sysbios.rts 的内容(空):*/
    
    * ti.linkbios.rts.ti 的内容(ti/sysbios/ti/linkcmd.xdt):*/
    
    /* ti.sysbios.ti.rts 的内容(空)*
    
    / sysbios.ti.ti/sysbios.ti.ti/sysbios.ti.ti.ti/sysbios.ti.ti.ti.rts (
    
    空)
    
    *内容
    
    :*/sysbios/sysbios.ti.ti.ti.ti/sysbios.ti.ti.ti/sysbios.ti.ti.ti.ti.ti/sysbios.ti.ti.ti.ti/sysbios.rts (空) //
    ti_sysbios_family_C66_cache_l1dSize = 32768;
    ti_sysbios_family_C66_cache_l1pSize = 32768;
    ti_sysbios_family_c66_cache_l2Size = 131072;
    
    //* ti.sysbios.states 中的内容(空):*//
    
    (空
    
    
    
    
    
    )
    
    //
    
    //* ti.sdo IPC 的内容(ti/sdo /ipc/linkcmd.xdt):*/
    
    SECTIONS
    {
    TI.sdo.ipc.SharedRegion_0:{. += 0x800000000;}运行> 0x8000000000、类型=空载
    }
    
    //来自 ti.sdo.ipc.ch堆 的内容(空):*/
    
    //来自 ti.sdo.ipc.family.c647x 的内容(空):*/
    
    // ti.sdo.ipc.notifyDrivers 的内容(空):*
    
    ////来自 ti.sdo.ipc.gates 的内容(空)*
    
    
    
    
    
    /*(空)://从 ipc.tid.ipc.nulls *(空 ti.runtime.ompbios) //
    
    //* configPkg 中的内容(空)://
    
    //////*来自 ti.ipc.remoteproc 的内容(ti/ipc/remoteproc/linkcmd.xdt):*
    
    
    
    ////*来自 xdc.services.io 的内容(空):*//
    
    
    ////*
    静态实例对象的符号别名*/
    
    xdc_runtime_Startup__EXECFXN_C = 1;
    xt_runtime_x_=
    
    1;xtex_rtc_runtime = 1
    
    ;
    = xdc_r_r_rtc_1;x_r_r_r_runtime_s_ 1;xt_r_r_ex_rand_r_ex_r_r_ex_ex_
    .text:load >> MSMCSRAM
    .ti.decompress: load > MSMCSRAM
    .stack:加载> L2SRAM
    组:加载> DDR3
    {
    .bss:
    .neardata:
    .rodata:
    }
    .cinit:加载> DDR3
    .pinit:加载>> DDR3
    init_array:load > DDR3
    .const:load >> DDR3
    .data:load >> DDR3
    .fardata:load >> DDR3
    .switch:load >> MSMCSRAM
    .sysmem:load > ddr3
    .far:load >> DDR3
    .args:load > L2SRAM align = 0x4、fill = 0{_argsize = 0x0;}
    .cio:load >> L2SRAM
    .ti.handler_table:load > DDR3
    .c6xabi.exidx:加载> DDR3
    .c6xabi.extab:load >> DDR3
    .tdata:加载> DDR3
    tbss:load > DDR3
    vecs:load > MSMCSRAM
    xdc.meta:load > DDR3、type = copy
    
    }
    

    此致

     

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

    如果有任何更新,请告诉我...

    此致