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.

[参考译文] CC3235SF:如何控制系统堆和系统堆栈大小?

Guru**** 2577385 points
Other Parts Discussed in Thread: CC3235SF, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/991011/cc3235sf-how-to-control-system-heap-and-system-stack-size

器件型号:CC3235SF
Thread 中讨论的其他器件: SysConfig

问题:对于 CC3235、如何查看和调整默认系统堆(即 C 库)和系统(硬件)堆栈的大小?

背景:我正在 CC3235SF LaunchPad 上开发 C++应用程序。  到目前为止、我有两个串行驱动程序对象在 FreeRTOS 下正常工作。  我已向我的编译添加了一个源文件、该源文件覆盖 malloc()、calloc()、free()、new()、new[]()、 delete()和 delete[]()并将它们重定向到 FreeRTOS 管理的堆(heap_4.c),我目前已将其设置为150KB。  就我所能说的、内存分配工作正常。

但是、我看不到我可以在哪里查看或调整 CC3235的存储器映射、特别是堆和堆栈的分配。  当我将所有标准堆函数映射到 FreeRTOS 堆时、我想将"默认"系统堆设置为最小值(例如4KB)。  我还想验证系统堆栈、并可能增大其大小。

我发现 有一篇文章 谈到了其中的一些内容;推定的解决方案说:"对于 Gen2、堆+堆栈的大小可以在"XXX...XXX.cmd"文件中设置"。  我无法在任何位置找到相应的.cmd 文件。  我使用的是 CCS 10.2、SL SDK 4.1和 SysConfig 1.7.0;我看不到在 SysConfig (仅外设/库选择)或 CCS 工程编译配置中配置堆栈或堆的任何选项。  我缺少什么?

戴维·R.

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

    在 CCS 工程中、您应该在任何参考应用中找到链接器命令文件("XXX.cmd")。 在 GCC 项目中 、等效 项为"XXX.lds"。

    这些文件对于任何嵌入式工程都是必需的、因为它们定义了存储器布局、

    BR、

    Kobi

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

    好的、找到了 LDS 文件。  默认情况下、堆栈大小为0x800 (2KB)。   但是、LDS 文件中没有定义系统堆的大小。  这是如何控制的?  (编辑:我正在使用从"local_time" SL 示例派生的项目、这是我正在使用的 LDS 文件。)

    /*
     * Copyright (c) 2018-2020, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the
     *    documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    STACKSIZE = 0x800;
    
    MEMORY
    {
        FLASH_HDR (RX)  : ORIGIN = 0x01000000, LENGTH = 0x7FF
        FLASH     (RX)  : ORIGIN = 0x01000800, LENGTH = 0x0FF800
        SRAM      (RWX) : ORIGIN = 0x20000000, LENGTH = 0x00040000
        /* Explicitly placed off target for the storage of logging data.
         * The data placed here is NOT loaded onto the target device.
         * This is part of 1 GB of external memory from 0x60000000 - 0x9FFFFFFF.
         * ARM memory map can be found here:
         * developer.arm.com/.../about-the-memory-map
         */
        LOG_DATA (R) : ORIGIN = 0x90000000, LENGTH = 0x40000
    }
    
    REGION_ALIAS("REGION_HDR", FLASH_HDR);
    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_LOG", LOG_DATA);
    REGION_ALIAS("REGION_ARM_EXIDX", FLASH);
    REGION_ALIAS("REGION_ARM_EXTAB", FLASH);
    
    SECTIONS {
    
        .dbghdr : ALIGN (2048) {
            KEEP (*(.dbghdr))
        } > REGION_HDR
    
        PROVIDE (_resetVecs_base_address =
            DEFINED(_resetVecs_base_address) ? _resetVecs_base_address : 0x01000800);
    
        .resetVecs (_resetVecs_base_address) : AT (_resetVecs_base_address) {
            KEEP (*(.resetVecs))
        } > REGION_TEXT
    
        .ramVecs (NOLOAD) : ALIGN(1024) {
            KEEP (*(.ramVecs))
        } > REGION_DATA
    
        .text : {
            CREATE_OBJECT_SYMBOLS
            *(.text)
            *(.text.*)
            . = ALIGN(0x4);
            KEEP (*(.ctors))
            . = ALIGN(0x4);
            KEEP (*(.dtors))
            . = ALIGN(0x4);
            __init_array_start = .;
            KEEP (*(.init_array*))
            __init_array_end = .;
            *(.init)
            *(.fini*)
        } > REGION_TEXT AT> REGION_TEXT
    
        PROVIDE (__etext = .);
        PROVIDE (_etext = .);
        PROVIDE (etext = .);
    
        .rodata : {
            *(.rodata)
            *(.rodata*)
        } > REGION_TEXT AT> REGION_TEXT
    
        .data : ALIGN (4) {
            __data_load__ = LOADADDR (.data);
            __data_start__ = .;
            *(.data)
            *(.data*)
            . = ALIGN (4);
            __data_end__ = .;
        } > REGION_DATA AT> REGION_TEXT
    
        .ARM.exidx : {
            __exidx_start = .;
            *(.ARM.exidx* .gnu.linkonce.armexidx.*)
            __exidx_end = .;
        } > REGION_ARM_EXIDX AT> REGION_ARM_EXIDX
    
        .ARM.extab : {
            *(.ARM.extab* .gnu.linkonce.armextab.*)
        } > REGION_ARM_EXTAB AT> REGION_ARM_EXTAB
    
        .bss : {
            __bss_start__ = .;
            *(.shbss)
            *(.bss)
            *(.bss.*)
            *(COMMON)
            . = ALIGN (4);
            __bss_end__ = .;
        } > REGION_BSS AT> REGION_BSS
    
        .heap : {
            __heap_start__ = .;
            end = __heap_start__;
            _end = end;
            __end = end;
            KEEP(*(.heap))
            __heap_end__ = .;
            __HeapLimit = __heap_end__;
        } > REGION_HEAP AT> REGION_HEAP
    
        .stack (NOLOAD) : ALIGN(0x8) {
            _stack = .;
            __stack = .;
            KEEP(*(.stack))
            . += STACKSIZE;
            _stack_end = .;
            __stack_end = .;
        } > REGION_STACK AT> REGION_STACK
    
        .log_data (COPY) : {
            KEEP (*(.log_data))
        } > REGION_LOG
    }
    
    ENTRY(resetISR)

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

    使用 FreeRTOS 时、可在 FreeRTOSConfig、h 中定义堆大小、例如、请参阅以下内容:

    kernel/freertos/builds/cc32xx/release/freeRTOSConfig.h:#define CONFIGTAL_HACK_SIZE       (( size_t )( 0x8000 ))

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

    好的、所以您只能使用 FreeRTOS 堆并完全禁用"系统"堆(即在链接器文件中分配0个字节)。  明白了、谢谢。