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/PROCESSOR-SDK-AM335X:让 BIOS 堆使用最大可用内存量

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/921135/ccs-processor-sdk-am335x-have-bios-heap-use-the-maximum-amount-of-memory-available

器件型号:PROCESSOR-SDK-AM335X

工具/软件:Code Composer Studio

你好

指定 BIOS 系统堆的建议方法似乎要求我们对位置和大小进行硬编码:

var loadAndBss = 25 * 1024 * 1024;
var totalRam = 0x20000000;
BIOS.heapSize = totalRam - textAndBss;

var heapSection = new Program.SectionSpec ();
heapSection.loadAddress = 0x80000000 + textalRam - BIOS.heapSize;
heapSection.runAddress = heapot.Section=

Program.sectMap[".system.heap"]
;heap.Section ="Heapotap.back.backs";"inch"="ina.load.Section ="ina.load.back"

很明显、这种情况并不好、因为我们必须假定 text+bss 的大小值过大而浪费大量的内存、或者我们在每次编译时都被迫手动更新硬编码值。  是否有办法让链接器找出堆的最佳位置以实现最大内存利用率?

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

    您好!

    我认为不需要使用 sectionSpec loadAddress。

    请参阅 /docs/docs/cdoc/xdc/cfg/Program.html、配置 Program.sectMap //模块范围:

    例如、假设平台定义了一个名为"DDR2"的内存段。 以下配置语句将".text"段中的所有内容放入"DDR2"段中。
    Program.sectMap[".text"]= new Program.SectionSpec ();
    Program.sectMap[".text"].loadSegment ="DDR2";

    在这种情况下、链接器确定位置。

    如果需要、我会让一位同事发表更多评论。

    此致、
    弗兰克

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

    我已经尝试过这种方法、但这有2个问题。

    1) 1)您仍然必须指定堆大小。

    2)由于无法控制 cfg 文件中的段的顺序、bin 文件变得很大(512MB 或整个 RAM 大小)。   

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

    您好!

    你说 bin 文件的大小取决于堆的大小和位置吗? 如果是这种情况、那么我怀疑映像中包含0作为堆存储器的初始化时出现问题。

    此致、
    弗兰克

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

    当然可以。  如果堆放置在两个包含代码或数据的段之间、则 objcopy 将增大 bin 文件以适应该文件。

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

    我不认为 bin 文件应该增加、因为堆是 RAM、所以堆会增加。 bin 文件应仅包含初始化的数据。

    我假设您使用的是 GCC 编译器。 您是否曾尝试使用 Program.sectionsExclude? 例如:

    //从 ARM 映像中删除段以排除用于堆初始化的0。
    //必须在链接器命令文件中为该段具有相应的 NoLoad 说明符。
    Program.sectionsExclude ="^\.myHeap ";

    此致、
    弗兰克

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

    我尝试删除 runAddress/loadAddress 并在 Program.sectionsExclude 中添加".system.heap"段、但 objcopy 仍会创建一个巨大的 bin 文件(491MB)。   

    下面是生成的 linker.cmd 文件:

    /*
    此文件由 GNG.target.arm 软件包中的 linkcmd_BM_v7a.xdt 生成。
    */
    
    entry (_c_int00)
    
    _TI_STACK_SIZE = 0x1000;
    __STACK_SIZE =__TI_STACK_SIZE;
    
    __Hap_SIZE = 0x0;
    
    INPUT (
    "/home/clarkson/projects/er-301/bin/firmware/sysbios/package/cfg/release_pa8fg.oa8fg "
    "/home/clarkson/projects/er-301/bin/firmware/sysbios/package/cfg/release_pa8fg.src/sysbios/sysbios.aa8fg "
    "/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/gnu.targets.arm.rtsv7A.aa8fg "
    "/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/boot.aa8fg "
    “/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/syscalls.aa8fg”
    )
    
    内存
    {
    SRAM (rwx):org = 0x402f0400,len = 0x1fbff
    DDR3 (Rwx):org = 0x80000000,len = 0x20000000
    }
    
    //*
    要将.fass、.text、.data、.heap 或.stack 放入
    *不同的存储器段,请更改相应的 region_alias。
    //
    region_alias ("region_BSS"、DDR3);
    region_alias ("region_text"、DDR3);
    region_alias ("region_data"、 DDR3);
    region_alias ("region_stack"、DDR3);
    region_alias ("region_heap"、DDR3);
    region_alias ("region_arm_EXTAB"、DDR3);
    region_alias ("region_arm_EXIDX"、DDR3);
    
    /*
    静态实例对象的符号别名
    */
    xdc_runtime_Startup__EXECFXN_C = 1;
    xdc_runtime_Start_Systi_C = 1;
    
    */xrts
    
    
    
    
    
    sysrts systi_ti_commits/xinc/content/bs./intran.ins/bs./content/bc/brand/content/links/bs./content/bs.ms/ts/bs./content/content/rts (来自
    
    ti.sysbios.family.arm.a8.intcps */bios/rts/bs./content/rts./content/content/rts/bs./rts./content/content/content/rts./content/rts./content/content/rts./content/rts./content/content/rts./rts/ */
    ti_SysBIOS_family_ARM_A8_intcps_Hwi_INTC = 0x48200000;
    
    
    SECTIONS{
    
    c_int00 0x8000000:{*(.c_int00)}
    vecs:{*(.vecs)} at>DDR3
    TI.sysbios.family.arm.a8.mutableSection (NoLoad):{*(ti.sysbios.family.arm.a8.mutableSection)} at>DDR3
    xdc.meta (副本):{keep(*)(Xdc.meta)} at>DDR3
    
    
    c_int00:{
    保留(*(.c_int00)
    )} > region_text
    
    .text:{
    create_object_symbols
    保留(*(.resetVecs))
    保留(*(.text))
    *(.text.*)
    *(.gnu.linkone.t*)
    *(.GNU.warning)
    *(.胶 水*)
    。 =对齐(0x4);
    保留(*(.ctors))
    *(.gnu.linkone.r*)
    。 =对齐(0x4);
    __init_array_start =.;
    Keep (*(sort (.init_array。*)))
    Keep (*(.init_array))
    __init_array_end =.;
    *(.init)
    *(.fini*)
    } > region_text
    
    rodata:{
    *(.rodata)
    *(.rodata.*)
    } > region_text
    
    arm.extab:{
    *(.arm.extab*)
    *(.gnu.linkone.armextab.*)
    } > REGAL_ARM_EXTAB
    
    arm.exidx:{
    _exidx_start =.;
    *(.arm.exidx*)
    *(.gnu.linkone.armexidx.*)
    _exidx_end =.;
    } > REGAL_ARM_EXIDX
    
    etext =.;
    _etext =.;
    _etext =.;
    
    .data :{
    __DATA_LOADDR___= LOADDR (.data);
    __data_start__=.;
    *(.got.plt)
    *(.GOT)
    *(.shdata)
    保留(*(.data))
    保留(*(.data*))
    *(.gnu.linkone.d*)
    。 =对齐(4);
    __DATA_END__=;
    } > region_data at > region_text
    
    /*
    *将.heap 段放在.bss 和.stack 之前作为_sbrk
    * libridimon.a 中的实现会比较(heap_end + incr)
    *到当前 SP 值以检查堆是否已重叠
    *使用堆栈。
    *
    *如果在 SYS/BIOS 应用中将.heap 放置在.bss 和.stack 之间、
    *当任务堆栈(在.bss 中分配)是当前堆栈时、
    *_sbrk 中的堆检查将失败并甚至触发错误
    *尽管堆可能没有与实际重叠
    *系统堆栈。
    *
    堆:align (0x100){
    _heap_start__=.;
    结束=_heap_start__;
    _end =结束;
    _end =结束;
    。 +=_heap_size;
    _heap_end_=.;
    __HeapLimit=__heap_end__;
    } > region_heap
    
    .bss:{
    _bss_start__=.;
    *(.shbss)
    保留(*(.bss))
    *(.bss.*)
    *(.gnu.linkone.b*)
    *(通用)
    。 =对齐(4);
    __bss_end__=;
    } > REGASE_BSS
    
    .stack:align (0x0008){
    _TI_STACK_BASE =.;
    _stack =.;
    。 +=_TI_STACK_SIZE;
    } > REGASE_STACK
    
    stab 0:{*(.stab)}
    .st3.r 0:{*(.str)}
    .stab.ex 0:{*(.stab.ex)}
    stab.exclstr 0:{*(.stab.exclstr)}
    .stab.index 0:{*(.stab.index)}
    .stab.indexstr 0:{*(.stab.indexstr)}
    .comment 0:{*(.comment)}
    
    调试 0:{*(.debug)}
    .line 0:{*(.line)}
    .debug_srcinfo 0:{*(.debug_srcinfo)}
    .debug_sfnames 0:{*(.debug_sfnames)}
    .debug_aranges 0:{*(.debug_aranges)}
    .debug_pubnames 0:{*(.debug_pubnames)}
    debug_info 0:{*(.debug_info)}
    .debug_Abbrev 0:{*(.debug_Abbrev)}
    调试行 0:{*(.debug_line)}
    .debug_frame 0:{*(.debug_FRAME)}
    .debug_str 0:{*(.debug_str)}
    .debug_loc 0:{*(.debug_loc)}
    .debug_macinfo 0:{*(.debug_macinfo)}
    .debug_wennames 0:{*(.debug_wennames)}
    .debug_funcnames 0:{*(.debug_funcnames)}
    .debug_typeNames 0:{*(.debug_typeNames)}
    .debug_varnames 0:{*(.debug_varnames)}
    .debug_pubTypes 0:{*(.debug_pubTypes)}
    debug_ranges 0:{*(.debug_Ranges)}
    
    //
    
    *函数别名*/
    xdc_runtime_System_asprintf_va_E = xdc_runtime_System_asprintf_va_F;
    xdc_runtime_System_snprintf_va_E = xdc_runtime_System_printf_va_f;xtunime_f_prature_prature_f_rf_prage_prune_prage_f_prage_f_pruntime_f_prage_prage_prage_f_prage_f_prage_x_f_rf_rf_rf_rf_xtva_rf_rf_rf_rf_xta_rf_rf_x_rf_rf_prue_system_rf_pru_prue_
    
    
    
    

    这里是 cfg 文件:

    //所有 SYS/BIOS 构建共享的配置。
    
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Assert = xdc.useModule('xdc.runtime.Assert');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    
    var Main = xdc.useModule('xdc.runtime.Main');
    var Memory = xdc.useModule('xdc.runtime.Memory'
    ) var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var Hwi2 = xdc.useModule('ti.sysbios.hal.Hwi');
    
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    var Event = xdc.useModule('ti.sysbios.knl.Event');
    var Idle = xdc.useModule('ti.sysbios.knl.Idle');
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    var MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    var Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    
    // var TimerProvider = xdc.useModule('ti.sysbios.timers.dmtimer.TimestampProvider');
    var TimerProvider = xdc.useModule('ti.sysbios.family.arm.a8.TimestampProvider');
    
    var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
    var HeapMultiBuf = xdc.useModule('ti.sysbios.heaps.HeapMultiBuf');
    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    
    
    Task.addHookSet (
    switchFxn:"&onTaskSwitch"
    、});
    
    System.extendedFormats +="%f";
    
    //
    *最小化系统中的退出处理程序数组。 System 模块包括
    *一组函数,这些函数在 System_atexit()中注册,
    *由 System_exit()调用。
    //
    System.maxAtexitHandlers = 4;
    
    //
    *取消注释此行以禁用 Error print 函数。
    *禁用时,我们会丢失错误信息,因为
    *不打印错误。 如果
    *由于 Error_print()函数
    *调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
    error.raiseHook =空;
    */
    
    /*
    取消注释此行以防止*在
    目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args、而不是
    *格式化的消息。
    text.isLoaded = false;
    */
    
    /*
    取消注释此行以在
    程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    SysMin.flushAtExit = false;
    */
    SysMin.flushAtExit = true;
    
    //将入口点放在起始位置(b车)
    Program.sectMap[".c_int00"]= new Program.SectionSpec ();
    Program.sectMap[".c_int00"].runAddress = 0x80000000;
    
    //
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    //
    文本+ BSS < 4700kB
    //var textAndBss = 5 * 1024 * 1024;
    var textAndBss = 25 * 1024 * 1024;
    var totalRam = 0x20000000;
    BIOS.heapSize = totalRam - textAndBss;
    
    var heapSection = new Program.SecitionSpec ();//totalRam =
    0x0000.HeapSection.In=0x80000000;heapSection.runAddress ="NoapheSection.IncheSection.In=0x0000.IncheLoad = 0x0000.In.In.In.In_IncheSection.In.In.In.In_
    
    Program.sectMap["system.heap"]
    BIOS.heapSection ="system.heap"
    //删除段以从 ARM 映像中排除0用于堆初始化。
    //必须在链接器命令文件中为该段具有相应的 NoLoad 说明符。
    Program.sectionsExclude ="system.heapTrack";
    
    //对默认堆使用 HeapTrack
    BIOS.heapTrackEnabled = false;
    
    //系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 4 * 1024;
    
    // System_printf ()的循环缓冲区大小*/
    SysMIN.bufSize = 8 * 1024;
    
    System.SupportProxy = 4 * 1024;SysTonn.WriteUST_SysTonn.Error
    ;SysTonn" SysTIn.WriteError = SysTonn";SysTIn.eError = SysTonn"
    
    
    BIOS.swiEnabled = true;
    BIOS.taskEnabled = true;
    
    //为外设地址设置 MMU */
    MMU。enableMMU = true;
    
    //强制外设段为不可高速缓存的严格排序内存
    var atttrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0、
    可缓冲:false、 //可缓冲
    可高速缓存:false、 //可缓存
    可共享:false、 //可共享
    NoExecute:true、 //不可执行
    };
    
    对于(var addr = 0x44000000;addr < 0x57000000;addr += 0x00100000){
    Mmu.setFirstLevelDescMeta(addr、addr、atttrs);
    }
    
    Task.checkStackFlag = false;
    Hwi2.checkStackFlag = false;
    
    Task.deleteTerminatedTasks = false;
    
    Clock.swiPriority = 10;
    //动态模式似乎具有更准确的时序
    //但是! 它会严重减少点击/弹出之前可用的 CPU 数量、并以较低的缓冲区大小完全中断 ADC。
    // Clock.tickMode = Clock.tickMode_dynamic;
    
    var Load = xdc.useModule('ti.sysbios.utils.Load');
    Load.windowInMS = 1000;
    Load.taskEnabled = true;
    //Clock.timerId = 5;
    Clock.tickPeriod = 1000;
    

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

    出于完整性考虑、以下是我通常使用的链接器文件和 cfg 文件、但有一个问题:我需要对堆的大小/位置进行硬编码、但至少生成的 bin 文件与 text+bss 的大小匹配(在我的情况下为3.9MB):

    /*
    此文件由 GNG.target.arm 软件包中的 linkcmd_BM_v7a.xdt 生成。
    */
    
    entry (_c_int00)
    
    _TI_STACK_SIZE = 0x1000;
    __STACK_SIZE =__TI_STACK_SIZE;
    
    __Hap_SIZE = 0x0;
    
    INPUT (
    "/home/clarkson/projects/er-301/bin/firmware/sysbios/package/cfg/release_pa8fg.oa8fg "
    "/home/clarkson/projects/er-301/bin/firmware/sysbios/package/cfg/release_pa8fg.src/sysbios/sysbios.aa8fg "
    "/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/gnu.targets.arm.rtsv7A.aa8fg "
    "/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/boot.aa8fg "
    “/home/clarkson/ti-old/bios_6_46_05_55/packages/gnu/targets/arm/rtsv7A/lib/syscalls.aa8fg”
    )
    
    内存
    {
    SRAM (rwx):org = 0x402f0400,len = 0x1fbff
    DDR3 (Rwx):org = 0x80000000,len = 0x20000000
    }
    
    //*
    要将.fass、.text、.data、.heap 或.stack 放入
    *不同的存储器段,请更改相应的 region_alias。
    //
    region_alias ("region_BSS"、DDR3);
    region_alias ("region_text"、DDR3);
    region_alias ("region_data"、 DDR3);
    region_alias ("region_stack"、DDR3);
    region_alias ("region_heap"、DDR3);
    region_alias ("region_arm_EXTAB"、DDR3);
    region_alias ("region_arm_EXIDX"、DDR3);
    
    /*
    静态实例对象的符号别名
    */
    xdc_runtime_Startup__EXECFXN_C = 1;
    xdc_runtime_Start_Systi_C = 1;
    
    */xrts
    
    
    
    
    
    sysrts systi_ti_commits/xinc/content/bs./intran.ins/bs./content/bc/brand/content/links/bs./content/bs.ms/ts/bs./content/content/rts (来自
    
    ti.sysbios.family.arm.a8.intcps */bios/rts/bs./content/rts./content/content/rts/bs./rts./content/content/content/rts./content/rts./content/content/rts./content/rts./content/content/rts./rts/ */
    ti_SysBIOS_family_ARM_A8_intcps_Hwi_INTC = 0x48200000;
    
    
    SECTIONS{
    
    c_int00 0x8000000:{*(.c_int00)}
    system.heap 0x81900000 (NoLoad):{*(system.heap)}
    vecs:{*(.vecs)} at>DDR3
    TI.sysbios.family.arm.a8.mutableSection (NoLoad):{*(ti.sysbios.family.arm.a8.mutableSection)} at>DDR3
    xdc.meta (副本):{keep(*)(Xdc.meta)} at>DDR3
    
    
    c_int00:{
    保留(*(.c_int00)
    )} > region_text
    
    .text:{
    create_object_symbols
    保留(*(.resetVecs))
    保留(*(.text))
    *(.text.*)
    *(.gnu.linkone.t*)
    *(.GNU.warning)
    *(.胶 水*)
    。 =对齐(0x4);
    保留(*(.ctors))
    *(.gnu.linkone.r*)
    。 =对齐(0x4);
    __init_array_start =.;
    Keep (*(sort (.init_array。*)))
    Keep (*(.init_array))
    __init_array_end =.;
    *(.init)
    *(.fini*)
    } > region_text
    
    rodata:{
    *(.rodata)
    *(.rodata.*)
    } > region_text
    
    arm.extab:{
    *(.arm.extab*)
    *(.gnu.linkone.armextab.*)
    } > REGAL_ARM_EXTAB
    
    arm.exidx:{
    _exidx_start =.;
    *(.arm.exidx*)
    *(.gnu.linkone.armexidx.*)
    _exidx_end =.;
    } > REGAL_ARM_EXIDX
    
    etext =.;
    _etext =.;
    _etext =.;
    
    .data :{
    __DATA_LOADDR___= LOADDR (.data);
    __data_start__=.;
    *(.got.plt)
    *(.GOT)
    *(.shdata)
    保留(*(.data))
    保留(*(.data*))
    *(.gnu.linkone.d*)
    。 =对齐(4);
    __DATA_END__=;
    } > region_data at > region_text
    
    /*
    *将.heap 段放在.bss 和.stack 之前作为_sbrk
    * libridimon.a 中的实现会比较(heap_end + incr)
    *到当前 SP 值以检查堆是否已重叠
    *使用堆栈。
    *
    *如果在 SYS/BIOS 应用中将.heap 放置在.bss 和.stack 之间、
    *当任务堆栈(在.bss 中分配)是当前堆栈时、
    *_sbrk 中的堆检查将失败并甚至触发错误
    *尽管堆可能没有与实际重叠
    *系统堆栈。
    *
    堆:align (0x100){
    _heap_start__=.;
    结束=_heap_start__;
    _end =结束;
    _end =结束;
    。 +=_heap_size;
    _heap_end_=.;
    __HeapLimit=__heap_end__;
    } > region_heap
    
    .bss:{
    _bss_start__=.;
    *(.shbss)
    保留(*(.bss))
    *(.bss.*)
    *(.gnu.linkone.b*)
    *(通用)
    。 =对齐(4);
    __bss_end__=;
    } > REGASE_BSS
    
    .stack:align (0x0008){
    _TI_STACK_BASE =.;
    _stack =.;
    。 +=_TI_STACK_SIZE;
    } > REGASE_STACK
    
    stab 0:{*(.stab)}
    .st3.r 0:{*(.str)}
    .stab.ex 0:{*(.stab.ex)}
    stab.exclstr 0:{*(.stab.exclstr)}
    .stab.index 0:{*(.stab.index)}
    .stab.indexstr 0:{*(.stab.indexstr)}
    .comment 0:{*(.comment)}
    
    调试 0:{*(.debug)}
    .line 0:{*(.line)}
    .debug_srcinfo 0:{*(.debug_srcinfo)}
    .debug_sfnames 0:{*(.debug_sfnames)}
    .debug_aranges 0:{*(.debug_aranges)}
    .debug_pubnames 0:{*(.debug_pubnames)}
    debug_info 0:{*(.debug_info)}
    .debug_Abbrev 0:{*(.debug_Abbrev)}
    调试行 0:{*(.debug_line)}
    .debug_frame 0:{*(.debug_FRAME)}
    .debug_str 0:{*(.debug_str)}
    .debug_loc 0:{*(.debug_loc)}
    .debug_macinfo 0:{*(.debug_macinfo)}
    .debug_wennames 0:{*(.debug_wennames)}
    .debug_funcnames 0:{*(.debug_funcnames)}
    .debug_typeNames 0:{*(.debug_typeNames)}
    .debug_varnames 0:{*(.debug_varnames)}
    .debug_pubTypes 0:{*(.debug_pubTypes)}
    debug_ranges 0:{*(.debug_Ranges)}
    
    //
    
    *函数别名*/
    xdc_runtime_System_asprintf_va_E = xdc_runtime_System_asprintf_va_F;
    xdc_runtime_System_snprintf_va_E = xdc_runtime_System_printf_va_f;xtunime_f_prature_prature_f_rf_prage_prune_prage_f_prage_f_pruntime_f_prage_prage_prage_f_prage_f_prage_x_f_rf_rf_rf_rf_xtva_rf_rf_rf_rf_xta_rf_rf_x_rf_rf_prue_system_rf_pru_prue_
    
    
    
    

    和 cfg 文件:

    //所有 SYS/BIOS 构建共享的配置。
    
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Assert = xdc.useModule('xdc.runtime.Assert');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    
    var Main = xdc.useModule('xdc.runtime.Main');
    var Memory = xdc.useModule('xdc.runtime.Memory'
    ) var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var Hwi2 = xdc.useModule('ti.sysbios.hal.Hwi');
    
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    var Event = xdc.useModule('ti.sysbios.knl.Event');
    var Idle = xdc.useModule('ti.sysbios.knl.Idle');
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    var MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    var Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    
    // var TimerProvider = xdc.useModule('ti.sysbios.timers.dmtimer.TimestampProvider');
    var TimerProvider = xdc.useModule('ti.sysbios.family.arm.a8.TimestampProvider');
    
    var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
    var HeapMultiBuf = xdc.useModule('ti.sysbios.heaps.HeapMultiBuf');
    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    
    
    Task.addHookSet (
    switchFxn:"&onTaskSwitch"
    、});
    
    System.extendedFormats +="%f";
    
    //
    *最小化系统中的退出处理程序数组。 System 模块包括
    *一组函数,这些函数在 System_atexit()中注册,
    *由 System_exit()调用。
    //
    System.maxAtexitHandlers = 4;
    
    //
    *取消注释此行以禁用 Error print 函数。
    *禁用时,我们会丢失错误信息,因为
    *不打印错误。 如果
    *由于 Error_print()函数
    *调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
    error.raiseHook =空;
    */
    
    /*
    取消注释此行以防止*在
    目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args、而不是
    *格式化的消息。
    text.isLoaded = false;
    */
    
    /*
    取消注释此行以在
    程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    SysMin.flushAtExit = false;
    */
    SysMin.flushAtExit = true;
    
    //将入口点放在起始位置(b车)
    Program.sectMap[".c_int00"]= new Program.SectionSpec ();
    Program.sectMap[".c_int00"].runAddress = 0x80000000;
    
    //
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    //
    文本+ BSS < 4700kB
    //var textAndBss = 5 * 1024 * 1024;
    var textAndBss = 25 * 1024 * 1024;
    var totalRam = 0x20000000;
    BIOS.heapSize = totalRam - textAndBss;
    
    var heapSection = new Program.SecitionSpec ();
    heapSection.runAddress var totalRam = 0x80000000;
    
    var totalLoad = textAnapSection.IncheSect.Program.sectMap["system.heap"]= 0x0000HeapSection.NoHeapSection.IncheSect.= 0x0000.IncheLoad;var = 0x0000.NoheapSection.Inche
    BIOS.heapSection ="system.heapTrack"
    
    //对默认堆使用 HeapTrack
    BIOS.heapTrackEnabled = false;
    
    //系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 4 * 1024;
    
    // System_printf ()的循环缓冲区大小*/
    SysMIN.bufSize = 8 * 1024;
    
    System.stack_printn = SysTIn.eError =
    SysTON_Supportn;SysTIn.eN = SysTIn.WriteN = SysTIn.eError =
    8 *
    
    BIOS.swiEnabled = true;
    BIOS.taskEnabled = true;
    
    //为外设地址设置 MMU */
    MMU。enableMMU = true;
    
    //强制外设段为不可高速缓存的严格排序内存
    var atttrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0、
    可缓冲:false、 //可缓冲
    可高速缓存:false、 //可缓存
    可共享:false、 //可共享
    NoExecute:true、 //不可执行
    };
    
    对于(var addr = 0x44000000;addr < 0x57000000;addr += 0x00100000){
    Mmu.setFirstLevelDescMeta(addr、addr、atttrs);
    }
    
    Task.checkStackFlag = false;
    Hwi2.checkStackFlag = false;
    
    Task.deleteTerminatedTasks = false;
    
    Clock.swiPriority = 10;
    //动态模式似乎具有更准确的时序
    //但是! 它会严重减少点击/弹出之前可用的 CPU 数量、并以较低的缓冲区大小完全中断 ADC。
    // Clock.tickMode = Clock.tickMode_dynamic;
    
    var Load = xdc.useModule('ti.sysbios.utils.Load');
    Load.windowInMS = 1000;
    Load.taskEnabled = true;
    //Clock.timerId = 5;
    Clock.tickPeriod = 1000;
    

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

    您好!  

    我认为您需要向编译中添加自定义链接器命令文件、例如

    部分
    {
    
    /*
    从 ARM 映像中删除用于堆初始化的段到排除0。
    必须在 SYSBIOS 配置文件中具有相应的"Program.sectionsExclude"。
    *
    .ddrHeap (NoLoad):
    {
    *(.myHeap)
    } > DDR2
    } 

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

    您是否希望通过从链接器脚本的 cfg 生成部分中排除堆段并强制将其放置在自定义链接器脚本中指定的另一个(相对)位置来更改段的顺序?  我可以看到它在工作、我将尝试它。  我只需弄清楚如何将自定义链接器命令文件添加到我的非 CCS/GND-make 编译系统。

    但是、即使上述操作有效、仍然会留下更大的问题、即如何在不对堆进行硬编码的情况下指定堆大小、对吧?

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

    可能我不理解问题。

    需要在某个位置设置堆大小。 它如何不是"硬编码"? 如果它不是硬编码的、在哪里设置它? 请注意、这是为运行时堆分配的总(最大)空间、并且将消耗更多或更少的堆、具体取决于应用程序使用它的方式。 可以根据应用要求调整最大尺寸。

    使用上述方法、链接器可以确定所需存储器区域中堆的最佳位置。

    理想情况下、bin 文件不应受堆大小或位置的影响。

    正如我之前所说的、我曾在一位同事中找到了一位同事、他可能能够提供更多的想法。

    此致、
    弗兰克  

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

    您可以使用在链接器脚本中定义的符号。  例如、您可以在链接器脚本中定义2个符号、一个用于堆的开头、一个用于堆的末尾。  然后堆管理代码将使用这些符号之间的距离作为堆大小。  另一个示例是、如果所有固定大小的段都从开头连续放置在存储器中、则可以定义一个符号、该符号指向最后一个段之后的位置。  然后堆只扩展到存储器的末尾、然后只有 RAM 的总大小是硬编码的。

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

    请访问 http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/sysbios/6_53_02_00/exports/bios_6_53_02_00/docs/cdoc/ti/sysbios/heaps/HeapMem.html#primary.Heap.Base.Addr

    您可以使用链接器文件中的符号在.cfg 中创建堆。 然后、您可以将其分配给 Memory.defaultHeap。 例如(在  链接器文件中定义了_主堆_start__和_主堆_end__)。

    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    HeapMem.primaryHeapBaseAddr ="&&&&_primary_heap_start____";
    HeapMemMemMemory.Params (
    
    );
    heapMemParams.usePrimaryHeap = true;HeapEndAddr ="&&&&_primary_heap_end_______";var heapMemParams = new HeapMemMemMemMem.Params();= true;HEapmy.PareProgram.global.e0=u.eapmy.eapmy.Params.eapParams.eapParams.eapParams
    =
    
    Memory.defaultHeapInstance 

    您还可以使用 HeapCallback 并为堆提供所需的任何实现。

    Todd

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

    哦!  这看起来正是我想要的!  谢谢、Todd。

    今天我将尝试一下、然后返回给您。  顺便说一下、这样我就知道发生了什么。  

    问题1)在最后两行中,您是否创建了名为 heap0的*new*全局变量,然后将缺省 HeapInstance 指向它?  或者全局变量 heap0是否已经存在、从而对 BIOS 具有特殊意义?

    Q2) Memory.defaultHeapInstance 由 RTS 用于调用 malloc/free?

    Q3)声明链接器符号需要使用自定义链接器脚本、并且在 cfg 脚本中无法实现?

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

    [引用 user="BrianBrianBrian ]Q1)在最后两行中,您是否创建了名为 heap0的*新增*全局变量,然后将默认值 HeapInstance 指向它?  或者全局变量 heap0是否已经存在、从而对 BIOS 具有特殊意义?

    它没有特殊意义。 使用"Program.global.heap0"还会创建一个全局变量(称为"heap0")、C 代码可以引用该变量。 您需要具有#include

    [引用用户="BrianBrianBrian "]

    Q2) Memory.defaultHeapInstance 由 RTS 用于调用 malloc/free?

    [/报价]

    你获得了带有 malloc 的缺省堆、并且当你执行 Memory_alloc (NULL、blah、blah、blah)时;

    [引用用户="BrianBrianBrian "]

    Q3)声明链接器符号需要使用自定义链接器脚本、并且在 cfg 脚本中无法实现?

    [/报价]
    您需要在链接器脚本中指定符号并保留空间
    HEAPSIZE = 0x1000;HeapMem 使用的堆缓冲区的大小*
    
    / SECTIONS
    {
    (笑声)
    
    /* HeapMem 使用的堆缓冲区*/
    .priheap:{
    _primary_heap_start__=.;
    。 += HEAPSIZE;
    __primary_heap_end__=.;
    } > SRAM_DATA ALIGN 8
    
    (笑声) 

    Todd

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

    我只是想汇报一下、让您知道您的建议很有魅力。  谢谢你。  我最后要做的是:

    首先、我创建了自己的自定义链接器模板脚本(XDT)文件、并通过将其添加到编译过程中

    program.linkTemplate ="linkcmd_custom.xdt" 

    此自定义链接器模板脚本的内容是从默认使用的原始模板复制的。  在我的案例中、它是~/ti/bios_6_46_05_55/packages/gnu/targets/arm/linkcmd_bm_v7a.xdt.的副本  然后我对其进行了编辑、以便在末尾定义.heap 段、并使用点表达式将段的大小扩展到 RAM 的末尾(请参阅.heap 段)。

    [linkcmd_custom.xdt]

    %%{
    /*
    版权所有(c) 2008-2015 Texas Instruments 及其他。
    *保留所有权利。 本计划和随附材料
    *根据本
    发行版附带的 Eclipse 公共许可证 v1.0 *的条款提供、可在
    *  www.eclipse.org/.../epl-v10.html
    *
    *投稿者:
    *上获取 德州仪器(TI)-初始实施
    *
    *//
    
    //*链接器模板传递以下参数:
    * $out -生成的链接器的打开文件流
    * 命令文件
    * $args[] -应链接的零个或多个库的数组
    * 使用(按参数列表中显示的顺序)
    *
    我们不能添加"的名称周围;否则 GNU 链接器会查找
    名称*并使用"s。
    */
    
    /*
    裸机 ARM v7a 和 v7m 链接模板
    *
    *由 Brian Clarkson 为 ER-301定制
    *原始: /BIOS_6_46_05_55/packages/GNU/targets/arm/linkCMD_BM_v7a.xdt
    *
    /
    %%}
    /*
    此文件由 er-301/libs/sysbios/linkcmd_er301.xdt 生成。
    */
    
    entry (_c_int00)
    
    __TI_stack_size =`utils.toHex (prog.stack)`;
    __stack_size =__TI_stack_size;
    __heap_size =`utils.toHex (0x20000000 - 25 * 1024 * 1024)`;
    
    %if ($args.length > 0){
    INPUT
    %for (var i = 0;i <$args.length;i++){
    "`$args[i]`"
    %}
    %
    }
    
    内存
    {
    %for (var i = 0;i < prog.cpu.memoryMap.length;i++){
    %var mem= prog.cpu.memoryMap[i];
    %var page =(mem.page!= null)? ("页"+ mem.page +":"):"";
    %var org = utils.toHex (mem.base);
    %var len = utils.toHex (mem.len);
    %var access =(mem.access != null )? ("("+ mem.access +"):";
    `page``mem.name``access`:org =`org`、len =`len`
    %}
    }//
    
    *
    要将.pass、.text、.data、.heap 或.stack 放入
    *不同的存储器段,请更改相应的 region_alias。
    //
    region_alias ("region_BSS"、`Program.platform.dataMemory`);
    region_alias ("region_text"、`Program.platform.codeMemory`);
    region_alias ("region_data"、 `Program.platform.dataMemory`);
    region_alias ("region_stack"、`Program.platform.stackMemory`);
    region_alias ("region_heap"、`Program.platform.dataMemory`);
    region_alias ("region_arm_EXTAB"、`Program.platform.dataMemory`);
    region_alias ("region_arm_EXIDX"、`Program.platform.dataMemory`);
    
    //
    *静态实例对象的符号别名
    */
    %for (Program.symbol 中的 var sym){
    %var inst=Program.symbol[sym];
    %if (typeof(inst)=='number')
    ``this.build.target.asmName (sym)`=`insta;
    %}
    %else{
    %var objTab = inst.$module.$name.replace (/\./g、'_')+'_Object_Table_V';
    %var off = Program.$capsule.instSize(inst)* inst.$INDEX;
    `thes.build.target.asmName (sym)`=`thes.build.target.asmName (objTab)`+`off`;
    %}
    %}
    
    /*
    所有已加载软件包的链接器命令文件贡献:
    */
    %var _utils = XDC.loadCapsule ("GNU/targets/linkUtils.xs");
    `_utils.genContributions ($args)`
    
    SECTIONS{
    
    c_int00 0x8000000:{
    保留(*(.c_int00)
    )} > region_text
    
    ` utils.genSecions (prog)`
    
    .text:{
    create_object_symbols
    保留(*(.resetVecs))
    保留(*(.text))
    *(.text.*)
    *(.gnu.linkone.t*)
    *(.GNU.warning)
    *(.胶 水*)
    。 =对齐(0x4);
    保留(*(.ctors))
    *(.gnu.linkone.r*)
    。 =对齐(0x4);
    __init_array_start =.;
    Keep (*(sort (.init_array。*)))
    Keep (*(.init_array))
    __init_array_end =.;
    *(.init)
    *(.fini*)
    } > region_text
    
    rodata:{
    *(.rodata)
    *(.rodata.*)
    } > region_text
    
    arm.extab:{
    *(.arm.extab*)
    *(.gnu.linkone.armextab.*)
    } > REGAL_ARM_EXTAB
    
    arm.exidx:{
    _exidx_start =.;
    *(.arm.exidx*)
    *(.gnu.linkone.armexidx.*)
    _exidx_end =.;
    } > REGAL_ARM_EXIDX
    
    etext =.;
    _etext =.;
    _etext =.;
    
    .data :{
    __DATA_LOADDR___= LOADDR (.data);
    __data_start__=.;
    *(.got.plt)
    *(.GOT)
    *(.shdata)
    保留(*(.data))
    保留(*(.data*))
    *(.gnu.linkone.d*)
    。 =对齐(4);
    __DATA_END__=;
    } > region_data at > region_text
    
    .bss:{
    _bss_start__=.;
    *(.shbss)
    保留(*(.bss))
    *(.bss.*)
    *(.gnu.linkone.b*)
    *(通用)
    。 =对齐(4);
    __bss_end__=;
    } > REGASE_BSS
    
    .stack:align (0x0008){
    _TI_STACK_BASE =.;
    _stack =.;
    。 +=_TI_STACK_SIZE;
    } > REGASE_STACK
    
    stab 0:{*(.stab)}
    .st3.r 0:{*(.str)}
    .stab.ex 0:{*(.stab.ex)}
    stab.exclstr 0:{*(.stab.exclstr)}
    .stab.index 0:{*(.stab.index)}
    .stab.indexstr 0:{*(.stab.indexstr)}
    .comment 0:{*(.comment)}
    
    调试 0:{*(.debug)}
    .line 0:{*(.line)}
    .debug_srcinfo 0:{*(.debug_srcinfo)}
    .debug_sfnames 0:{*(.debug_sfnames)}
    .debug_aranges 0:{*(.debug_aranges)}
    .debug_pubnames 0:{*(.debug_pubnames)}
    debug_info 0:{*(.debug_info)}
    .debug_Abbrev 0:{*(.debug_Abbrev)}
    调试行 0:{*(.debug_line)}
    .debug_frame 0:{*(.debug_FRAME)}
    .debug_str 0:{*(.debug_str)}
    .debug_loc 0:{*(.debug_loc)}
    .debug_macinfo 0:{*(.debug_macinfo)}
    .debug_wennames 0:{*(.debug_wennames)}
    .debug_funcnames 0:{*(.debug_funcnames)}
    .debug_typeNames 0:{*(.debug_typeNames)}
    .debug_varnames 0:{*(.debug_varnames)}
    .debug_pubTypes 0:{*(.debug_pubTypes)}
    debug_ranges 0:{*(.debug_Ranges)}
    
    /*警告:我已经将堆放置在.bss 和.stack 之后、即
    * libridimon.a.出现问题 请参阅以下内容:
    *
    *将.heap 段放在.bss 和.stack 之前作为_sbrk
    * libridimon.a 中的实现会比较(heap_end + incr)
    *到当前 SP 值以检查堆是否已重叠
    *使用堆栈。
    *
    *如果在 SYS/BIOS 应用中将.heap 放置在.bss 和.stack 之间、
    *当任务堆栈(在.bss 中分配)是当前堆栈时、
    *_sbrk 中的堆检查将失败并甚至触发错误
    *尽管堆可能没有与实际重叠
    *系统堆栈。
    *
    堆:align (0x100){
    _heap_start__=.;
    /*。 +=__heap_size;*/
    /*堆扩展到 DDR3的末尾*/
    。 =原点(DDR3)+长度(DDR3);
    _heap_end_=.;
    } > region_heap
    
    }
    
    /*函数别名*/
    %if (prog.build.profile.match(/blas/)== null){
    % for (var keys = this.$aliases.keys();keys.hasMoreElements();){
    % var key = keys.nextElement ();
    `key`=`this。$aliases.get (key)`;
    %}
    %
    {
    //
    *@(#) GNG.targets.arm;1、0、0;10-21-2016 18:16:49; /db/ztree/library/trees/xdctargets/xdctargets-l07/src xlibrary
    
    */
    
    %%}
    

    最后、我从 cfg 文件中删除了 BIOS.heapSize 和 BIOS.heapSection 代码、并按照以下主题中的说明创建了我自己的默认实例:

    //所有 SYS/BIOS 构建共享的配置。
    
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    var Diags = xdc.useModule('xdc.runtime.Diags');
    var Assert = xdc.useModule('xdc.runtime.Assert');
    var Error = xdc.useModule('xdc.runtime.Error');
    var Log = xdc.useModule('xdc.runtime.Log');
    
    var Main = xdc.useModule('xdc.runtime.Main');
    var Memory = xdc.useModule('xdc.runtime.Memory'
    ) var SysMin = xdc.useModule('xdc.runtime.SysMin');
    var System = xdc.useModule('xdc.runtime.System');
    var Text = xdc.useModule('xdc.runtime.Text');
    
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    var Hwi = xdc.useModule('ti.sysbios.family.arm.a8.intcps.Hwi');
    var Hwi2 = xdc.useModule('ti.sysbios.hal.Hwi');
    
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    var Event = xdc.useModule('ti.sysbios.knl.Event');
    var Idle = xdc.useModule('ti.sysbios.knl.Idle');
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    var MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    var Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    
    // var TimerProvider = xdc.useModule('ti.sysbios.timers.dmtimer.TimestampProvider');
    var TimerProvider = xdc.useModule('ti.sysbios.family.arm.a8.TimestampProvider');
    
    var HeapBuf = xdc.useModule('ti.sysbios.heaps.HeapBuf');
    var HeapMultiBuf = xdc.useModule('ti.sysbios.heaps.HeapMultiBuf');
    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    
    
    Task.addHookSet (
    switchFxn:"&onTaskSwitch"
    、});
    
    System.extendedFormats +="%f";
    
    //
    *最小化系统中的退出处理程序数组。 System 模块包括
    *一组函数,这些函数在 System_atexit()中注册,
    *由 System_exit()调用。
    //
    System.maxAtexitHandlers = 4;
    
    //
    *取消注释此行以禁用 Error print 函数。
    *禁用时,我们会丢失错误信息,因为
    *不打印错误。 如果
    *由于 Error_print()函数
    *调用 System_printf(),禁用 raiseHook 将节省一些代码空间。
    error.raiseHook =空;
    */
    
    /*
    取消注释此行以防止*在
    目标上加载错误、断言和日志字符串。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args、而不是
    *格式化的消息。
    text.isLoaded = false;
    */
    
    /*
    取消注释此行以在
    程序退出时禁用 SysMin *的字符输出。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    sysmyn.flushAtExit = false;
    */
    sysmyn.flushAtExit = true;
    
    Program.linkTemplate ="linkcmd_custom.xdt"
    
    HeapMem.primaryHeapBaseAddr ="&__heapBasedr_start_";
    HeapMem.prelimeHeapEndr ="&_preleHeapMemBasebase_0;new_apmy.apmy.apmy.preMembish=
    
    heapMemParams.usePrimaryHeap
    
    Memory.defaultHeapInstance
    
    ;heapmy.apmy.apmy.apmem = heapmem = new.apmy.apmy.apmy.apmy.preum.apmy.pru.apmy.pru.pru.pru.pru.pruums =;heapmy.apmy.apmy.apmy.pru.ap
    
    
    /*系统堆栈大小(由 ISR 和 Swi 使用)*/
    Program.stack = 4 * 1024;
    
    /* System_printf ()的循环缓冲区大小*/
    SYSMIN.bufSize = 8 * 1024;
    
    System.SupportProxy = SYSMIN;
    SysMIN.outputFxn ="&UART_write";
    Error.raiseHook ="
    
    True;SystemEnabled BIOS;
    BIOS.taskEnabled = true;
    
    //为外设地址设置 MMU */
    MMU。enableMMU = true;
    
    //强制外设段为不可高速缓存的严格排序内存
    var atttrs ={
    键入:MMU。FirstLevelDesc_section、//段描述符
    TEX:0、
    可缓冲:false、 //可缓冲
    可高速缓存:false、 //可缓存
    可共享:false、 //可共享
    NoExecute:true、 //不可执行
    };
    
    对于(var addr = 0x44000000;addr < 0x57000000;addr += 0x00100000){
    Mmu.setFirstLevelDescMeta(addr、addr、atttrs);
    }
    
    Task.checkStackFlag = false;
    Hwi2.checkStackFlag = false;
    
    Task.deleteTerminatedTasks = false;
    
    Clock.swiPriority = 10;
    //动态模式似乎具有更准确的时序
    //但是! 它会严重减少点击/弹出之前可用的 CPU 数量、并以较低的缓冲区大小完全中断 ADC。
    // Clock.tickMode = Clock.tickMode_dynamic;
    
    var Load = xdc.useModule('ti.sysbios.utils.Load');
    Load.windowInMS = 1000;
    Load.taskEnabled = true;
    //Clock.timerId = 5;
    Clock.tickPeriod = 1000;
    

    再次感谢!