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/LAUNCHXL-CC1352R1:在 lds 文件中定义的 STACKSIZE 的用法。

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/925656/ccs-launchxl-cc1352r1-usage-of-stacksize-defined-in-lds-file

器件型号:LAUNCHXL-CC1352R1

工具/软件:Code Composer Studio

你好!

环境:

CC1352R1硬件版本 B
CCS 10.
SDK 4.20.00.35

问题:

我正在尝试找出 STACKSIZE (在.lds 文件中)用于什么。

在我的项目中、我在任务堆栈上使用了大量全局变量和临时变量。 当我使用 arm-none-eabi-size.exe 控制台显示大小时、会显示所有这些变量的总和:全局+任务+ STACKSIZE、但我不知道何时使用 STACKSIZE 存储器。

奇怪的是、为了使项目正常工作、我必须将 STACKSIZE 设置为最小值30k 字节(!)、项目将在 GPIO_init()上失败、否则(项目开始、之前仅为 Board_init())。 我的全局变量对所有任务堆栈都使用~30kb + 4KB 之类的内容、因此我几乎没有电路板上的存储器。  

可能在 ROV 中是检查内存使用情况的某种方法、或者可能是查看此内存使用情况的其他方法? 此外、如果您有任何建议、我可以采取哪些措施来减少所需的 STACKSIZE、这将非常有用。

Robert。

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

    您好、Robert、

    您能否提供有关您的项目设置的更多上下文?  与1376的 CCS 程序堆栈配置相比、默认 GNU 命令链接器文件为堆栈保留1024字节。  通过研究生成的映射文件的_stack_size 可以进一步验证这一点。  该 SRAM 保留供系统使用、包括常规任务和空闲任务。  使用的其他堆栈大小为应用和 MAC 任务保留 SRAM、但它们通常仍为2k 或更低。  堆是 SRAM 的另一个主要因素、通常设置为自动大小分配、以使用未指定用于其他函数的剩余内存。

    此致、
    Ryan

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

    您能否提供有关您的项目设置的更多上下文?

    我的项目是由 CC1352R1_Hello _GCC 示例项目创建的。

    我使用的驱动程序:

    • RTOS
    • AESCM
    • DMA
    • GPO
    • NVS
    • 趋势
    • UART
    • 射频(具有定制 IEEE 堆栈)

    我有:

    • 4个任务、每个任务具有1KB 字符阵列堆栈
    • 4个事件、每个任务一个
    • 3个队列
    • 自定义电源策略
    • 很少有寄存中断
    • 每个驱动程序一个结构

    当然、我的库使用多维标准::tuple (多个变量的 tuples 的 tuple 等)。


    我可以提供更多信息、但请您确切地说明什么?

    以下是我的.lds 配置文件:

    STACKSIZE = 1024*32;
    HEAPSIZE = 0x0400;
    
    存储
    器{
    闪存(RX) :origin = 0x00000000、length = 0x00057fa8
    Flash_CCFG (RX):origin = 0x00057fa8,length = 0x00000058
    SRAM (rwx) :origin = 0x20000000、length = 0x00014000
    GPRAM (rwx) :origin = 0x11000000、length = 0x00002000
    }
    
    region_alias ("region_text"、FLASH);
    region_alias ("region_BSS"、SRAM);
    region_alias ("region_data"、 SRAM);
    region_alias ("region_stack"、SRAM);
    region_alias ("region_heap"、SRAM);
    region_alias ("region_arm_EXIDX"、FLASH);
    region_alias ("region_arm_EXTAB"、FLASH);
    
    SECTIONS{
    
    提供(_intvecs_base_address =
    已定义(_intvecs_base_address)? _intvecs_base_address:0x0);
    
    .intvecs (_intvecs_base_address):at (_intvecs_base_address){
    保留(*(.intvecs)
    )} > region_text
    
    提供(_vtable_base_address =
    已定义(_vtable_base_address)? _vtable_base_address:0x20000000);
    
    .vtable (_vtable_base_address)(空载):{
    保留(*(.vtable)
    )} > region_data
    
    _rom_data_start = 0x20000100;
    _rom_data_size =定义(rom_data_size)? 12:已定义(rom_data_size_no_OAD)? 0x108:0;
    
    .rom_data_reserve (_rom_data_start):{
    。 +=_rom_data_size;
    } > region_data
    
    UDMACC26XX_CONFIG_BASE = 0x20001800;
    
    DMA_UART0_RX_CONTRAL_TABLE _entry_address =(UDMACC26XX_CONFIG_BASE + 0x10);
    DMA_UART0_TX_CONTRAL_TABLE _entry_address =(UDMACC26XX_CONFIG_BASE + 0x20);
    DMA_SPI0_RX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x30);
    DMA_SPI0_TX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x40);
    DMA_UART1_RX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x50);
    DMA_UART1_TX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x60);
    DMA_ADC_PRI_CONTACT_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x70);
    DMA_GPT0A_PRI_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x90);
    DMA_SPI1_RX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x100);
    DMA_SPI1_TX_CONTRAL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x110);
    
    DMA_UART0_RX_ALT_CONTROL_TABLE _entry_address =(UDMACC26XX_CONFIG_BASE + 0x210);
    DMA_UART0_TX_ALT_CONTROL_TABLE _entry_address =(UDMACC26XX_CONFIG_BASE + 0x220);
    DMA_SPI0_RX_ALT_CONTROL_TABLE _entry_address =(UDMACC26XX_CONFIG_BASE + 0x230);
    DMA_SPI0_TX_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x240);
    DMA_UART1_RX_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x250);
    DMA_UART1_TX_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x260);
    DMA_ADC_ALT_CONTROL_TABLE 条目地址 =(UDMACC26XX_CONFIG_BASE + 0x270);
    DMA_GPT0A_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x290);
    DMA_SPI1_RX_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x300);
    DMA_SPI1_TX_ALT_CONTROL_TABLE _ entry_address =(UDMACC26XX_CONFIG_BASE + 0x310);
    
    UDMACC26XX_uart0RxControlTableEntry_IS_PLOAD= 0;
    .dmaUart0RxControlTableEntry DMA_UART0_RX_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART0_RX_CONTROL_TABLE 项_ADDRESS){*(.dmaUart0RxControlTableEntry)}> region_data
    
    UDMACC26XX_uart0TxControlTableEntry_IS_PLOAD= 0;
    .dmaUart0TxControlTableEntry DMA_UART0_TX_CONTROL_TABLE entry_address (空载):AT (DMA_UART0_TX_CONTROL_TABLE entry_address){*(.dmaUart0TxControlTableEntry)}> region_data
    
    UDMACC26XX_dmaSpi0RxControlTableEntry_IS_PLOAD= 0;
    .dmaSpi0RxControlTableEntry DMA_SPI0_RX_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_SPI0_RX_CONTROL_TABLE 项_ADDRESS){*(.dmaSpi0RxControlTableEntry)}> region_data
    
    UDMACC26XX_dmaSpi0TxControlTableEntry_IS_PLOAD= 0;
    .dmaSpi0TxControlTableEntry DMA_SPI0_TX_CONTROL_TABLE entry_address (空载):AT (DMA_SPI0_TX_CONTROL_TABLE entry_address){*(.dmaSpi0TxControlTableEntry)}> region_data
    
    UDMACC26XX_uart1RxControlTableEntry_IS_PLOAD= 0;
    .dmaUart1RxControlTableEntry DMA_UART1_RX_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART1_RX_CONTROL_TABLE 项_ADDRESS){*(.dmaUart1RxControlTableEntry)}> region_data
    
    UDMACC26XX_uart1TxControlTableEntry_IS_PLOAD= 0;
    .dmaUart1TxControlTableEntry DMA_UART1_TX_CONTROL_TABLE entry_address (空载):AT (DMA_UART1_TX_CONTROL_TABLE entry_address){*(.dmaUart1TxControlTableEntry)}> region_data
    
    UDMACC26XX_dmaADCPriControlTableEntry_IS_PLOAD= 0;
    .dmaADCPriControlTableEntry DMA_ADC_PRI_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_ADC_PRI_CONTROL_TABLE 项_ADDRESS){*(.dmaADCPriControlTableEntry)}> region_data
    
    UDMACC26XX_dmaGPT0APriControlTableEntry_IS_PLOAD= 0;
    .dmaGPT0APriControlTableEntry DMA_GPT0A_PRI_CONTROL_TABLE_Entry_address (空载):AT (Dma_GPT0A_PRI_CONTROL_TABLE_LOCK_ADDRESS){*(.dmaGPT0APrimotTableControlEntry_address)}> region_data
    
    UDMACC26XX_dmaSpi1RxControlTableEntry_IS_PLOAD= 0;
    .dmaSpi1RxControlTableEntry DMA_SPI1_RX_CONTROL_TABLE entry_address (空载):AT (Dma_SPI1_RX_CONTROL_TABLE entry_address){*(.dmaSpi1RxControlTableEntry)}> region_data
    
    UDMACC26XX_dmaSpi1TxControlTableEntry_IS_PLOAD= 0;
    .dmaSpi1TxControlTableEntry DMA_SPI1_TX_CONTROL_TABLE entry_address (空载):AT (Dma_SPI1_TX_CONTROL_TABLE entry_address){*(.dmaSpi1TxControlTableEntry_address)}> region_data
    
    UDMACC26XX_uart0RxAltControlTableEntry_IS_PLOAD= 0;
    .dmaUart0RxAltControlTableEntry DMA_UART0_RX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART0_RX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaUart0RxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_uart0TxAltControlTableEntry_IS_PLOAD= 0;
    .dmaUart0TxAltControlTableEntry DMA_UART0_TX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART0_TX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaUart0TxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_dmaSpi0RxAltControlTableEntry_IS_PLOAD= 0;
    .dmaSpi0RxAltControlTableEntry DMA_SPI0_RX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_SPI0_RX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaSpi0RxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_dmaSpi0TxAltControlTableEntry_IS_PLOAD= 0;
    .dmaSpi0TxAltControlTableEntry DMA_SPI0_TX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_SPI0_TX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaSpi0TxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_uart1RxAltControlTableEntry_IS_PLOAD= 0;
    .dmaUart1RxAltControlTableEntry DMA_UART1_RX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART1_RX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaUart1RxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_uart1TxAltControlTableEntry_IS_PLOAD= 0;
    .dmaUart1TxAltControlTableEntry DMA_UART1_TX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_UART1_TX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaUart1TxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_dmaADCAltControlTableEntry_IS_PLOAD= 0;
    .dmaADCAltControlTableEntry DMA_ADC_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (Dma_ADC_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaADCAltControlTableEntry)}> region_data
    
    UDMACC26XX_dmaGPT0AAltControlTableEntry_IS_PLOAD= 0;
    .dmaGPT0AAltControlTableEntry DMA_GPT0A_ALT_CONTROL_TABLE_LOCK_ADDRESS (空载):AT (Dma_GPT0A_ALT_CONTROL_TABLE_LOCK_ADDRESS){*(.dmaGPT0AAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_dmaSpi1RxAltControlTableEntry_IS_PLOAD= 0;
    .dmaSpi1RxAltControlTableEntry DMA_SPI1_RX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_SPI1_RX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaSpi1RxAltControlTableEntry_address)}> region_data
    
    UDMACC26XX_dmaSpi1TxAltControlTableEntry_IS_PLOAD= 0;
    .dmaSpi1TxAltControlTableEntry DMA_SPI1_TX_ALT_CONTROL_TABLE 项_ADDRESS (空载):AT (DMA_SPI1_TX_ALT_CONTROL_TABLE 项_ADDRESS){*(.dmaSpi1TxAltControlTableEntry_address)}> region_data
    
    _rom_rodata_start = 0x2000;
    _rom_rodata_size =定义(ROM_RODATA_size)? 0:已定义(ROM_RODATA_SIZE _NO_OAD)? 0x330:0;
    
    .rom_rodata_reserve (_rom_rodata_start):{
    。 +=_rom_rodata_size;
    } > region_text at > region_text
    
    .text:{
    create_object_symbols
    *(.text)
    *(.text.*)
    。 =对齐(0x4);
    保留(*(.ctors))
    。 =对齐(0x4);
    保留(*(.ditors))
    。 =对齐(0x4);
    __init_array_start =.;
    保留(*(.init_array*))
    __init_array_end =.;
    *(.init)
    *(.fini*)
    } > region_text at > region_text
    
    提供(__etext =.);
    提供(_etext =.);
    提供(etext =.);
    
    rodata:{
    *(.rodata)
    *(.rodata.*)
    *(.rodata_*)
    } > region_text at > region_text
    
    .data:align (4){
    __DATA_LOADDR___= LOADDR (.data);
    __data_start__=.;
    *(.data)
    *(.data.*)
    。 =对齐(4);
    __DATA_END__=;
    } > region_data at > region_text
    
    arm.exidx:{
    _exidx_start =.;
    *(.arm.exidx*.gnu.linkone.armexidx.*)
    _exidx_end =.;
    } > REGION ARM_EXIDX、位于> REGION ARM_EXIDX
    
    arm.extab:{
    *(.arm.extab*.gnu.linkone.armextab.*)
    } > REGION ARM_EXTAB、> REGION ARM_EXTAB
    
    .NVS (空载):align (0x2000){
    *(.NVS)
    } > region_text
    
    ccfg:{
    保留(*(.ccfg)
    )} > FLASH_CCFG、位于> FLASH_CCFG
    
    .bss:{
    _bss_start__=.;
    *(.shbss)
    *(.bss)
    *(.bss.*)
    *(通用)
    。 =对齐(4);
    __bss_end__=;
    } > REGION _BSS AT > REGION BSS
    
    堆:{
    _heap_start__=.;
    结束=_heap_start__;
    _end =结束;
    _end =结束;
    Keep (*(.heap))
    _heap_end_=.;
    __HeapLimit=__heap_end__;
    } > region_heap at>region_heap
    
    /* HeapMem 使用的堆缓冲区*/
    .priheap:{
    。 =对齐(8);
    _primary_heap_start__=.;
    。 += HEAPSIZE;
    __primary_heap_end__=.;
    } > region_heap at>region_heap
    
    .stack (NoLoad):align (0x8){
    _stack =.;
    _stack =.;
    Keep (*(.stack))
    。 += STACKSIZE;
    } > region_stack at> region_stack
    }
    

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

    由于.lds 文件中列出的值不是默认值(分别为1024和0x1000)、您如何确定 STACKSIZE 和 HEAPSIZE?  如果解析生成的映射文件、则可以进一步了解内存分配。  如果您尚未找到它们、以下是一些其他 ROV 资源:

    https://dev.ti.com/tirex/explore/node?node=AAvd2v6HXXe-QpjluM.XgA__pTTHBmu__LATEST 
    https://dev.ti.com/tirex/content/simplelink_cc13x2_26x2_sdk_4_20_00_35/docs/proprietary-rf/proprietary-rf-users-guide/proprietary-rf-guide/debugging-index.html 
    https://processors.wiki.ti.com/index.php/Runtime_Object_View_(ROV) 
    https://training.ti.com/debugging-common-application-issues-ti-rtos 

    此致、
    Ryan

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

    [引用用户="Ryan Brown1"]

    由于.lds 文件中列出的值不是默认值(分别为1024和0x1000)、您如何确定 STACKSIZE 和 HEAPSIZE?  

    [/报价]

    这就是我的意思。 我必须大幅提高 STACKSIZE 才能使我的程序正常工作。  

    经过更多研究、我找到了一个解决方案、问题在于我初始化对象的方式。

    我想创建我的所有对象的编译时间,但内部对象中有许多交叉指针,我尝试在构造函数初始化列表中设置这些交叉指针,如下所示(伪代码):

    struct Attribute;
    struct Object;
    struct owner;
    
    struct Attribute{
    constexpr Object (Object*_obj):obj (_obj){}
    
    Object* obj;
    }
    struct Object{
    constexpr Object (owner*_owner):owner (_owner)、attr (createAttrs ())}{}
    constexpr::::stdple createAttrs(){
    返回{属性(this)等... };
    }
    
    owner* owner;
    std:tuple attr;
    }
    struct owner{
    constexpr owner():objs (createObjects()){}
    constexpr std:::tuple createObjects(){
    返回{对象(this)等... };
    }
    
    std:::tuple obj;
    } 

    我知道,当我创建对象时,程序在 createObjects()等方法上消耗了大量的 ISR 内存。 它可能创建了将其他对象聚合在一起的临时对象,然后在 std:tuple 上复制构造函数,并使用许多类型。 这样、我就产生了巨大的内存使用量和创建非编译时间对象的糟糕情况(我理解这一点吗?)。   

    解决方案是将所有指针默认设置为 nulptr,而不是使用引用,并且在我传递和设置所有指针时,为每个类/结构创建方法(如 init())创建所有指针(简而言之,地址的有趣性是运行时的)。