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.

[参考译文] MSP432E411Y:主要堆使用情况

Guru**** 2502205 points
Other Parts Discussed in Thread: MSP432E411Y

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1186309/msp432e411y-primary-heap-usage

器件型号:MSP432E411Y

您好!

在以下 URL 中有对主堆的描述。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/883639/ccs-cc1352r-problem-getting-heaptrack-running/3271396?tisearch=e2e-sitesearch&keymatch=priheap#3271396

此 URL 中的帖子显示"priheap is the primary heap (PRheap 只是主堆)"、但主堆是什么? 我想知道如何使用它。

我认为堆区域是由 sysmem 划分的、但主堆和 sysmem 之间有何区别?

就链接器命令文件而言、HEAPSIZE 设置的大小似乎放置在主堆段中。

*==== MSP432E411Y_BGAEVM.cmd =========
*定义 MSP432E411Y_BGAEVM M4的存储器块开始/长度
*
--stack_size=1024 // C 栈也用于 ISR 堆栈*/

HEAPSIZE = 0x20000;HeapMem 使用的堆缓冲区的大小*/

存储器

闪存(RX):origin = 0x00000000,length = 0x00100000
SRAM (rwx):origin = 0x20000000,length = 0x00040000

/*内存中的段分配*/

部分

.text:> FLASH
.const:> FLASH
.rodata:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.TI.ramfunc:{} load=flash,run=SRAM,table (BINIT)
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM

/* HeapMem 使用的堆缓冲区*/
.priheap:{
_primary_heap_start__=.;
。 += HEAPSIZE;
__primary_heap_end__=.;
}> SRAM 对齐8

.stack:> SRAM (高)

================================================================================

谢谢、

Astro

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

    尊敬的 Astro:

     请参阅以下关于.sysmem 的描述、了解它对堆存储器的使用。 sysmem 主要用于 malloc()使用的 C 运行时内存池。 您可以在 https://www.ti.com/lit/pdf/spnu118 汇编器用户指南中找到.sysmem 的详细信息。  

    C/C++语言使用两个名为.sysmem 和.stack 的未初始化段作为所使用的存储器池
    由 malloc()函数和运行时堆栈分别执行。  您可以使用来设置它们的大小
    --heap_size 或--stack_size 选项并立即将段的大小指定为4字节常量
    选项之后。 如果未使用这些选项、堆的默认大小为2K 字节、默认大小为
    堆栈为2K 字节。

      C/C++编译器针对使用的 C 运行时存储器池使用名为.sysmem 的未初始化段
    malloc()。 可以在链接时使用--heap_size 选项设置此存储器池的大小。 语法
    对于--heap_size 选项为:
    --heap_size=大小
    size 必须是一个常量。 以下示例定义了一个4K 字节的堆:
    armcl --run_linker --heap_size=0x1000 //*定义了一个4K 堆(.sysmem 段)*/
    只有在输入文件中存在.sysmem 段时、链接器才会创建.sysmem 段。

    HeapMem 是 TI-RTOS 用于 管理堆的实现。 请参阅本 TI-RTOS 内核实验课程中有关使用 HeapMem 管理堆的第10节, 它基本上类似于 使用 malloc()进行的标准 C 堆内存分配。 还有其他堆存储器管理实现、例如 HeapBuf 和 HeapMultiBuf、它们可以更高效。  

    https://training.ti.com/sites/default/files/docs/TI_RTOS_Kernel_Workshop_Student_Guide_rev4.00.pdf