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.

[参考译文] 编译器/TMS320F28375D:malloc 失败前只能有一次 malloc (1)

Guru**** 2551570 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/954545/compiler-tms320f28375d-can-only-malloc-1-once-before-malloc-fails

器件型号:TMS320F28375D

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

您好!

我尝试创建一个 CPP 对象、但在尝试 malloc 时、新建失败。 在进行了一些深入研究之后、我发现 malloc 失败了  

如果(size > heap_size())位于 memory.c 中 

我将堆大小从0x250更改为0x800 (在 properties->CCS build->Linker->Basic Options 下使用--heap_size 标志),但我仍然无法 malloc。

从更多的测试中、我注意到、如果我要求1个内存位置(malloc (1))、我只能获得 malloc 才能通过。 如果我尝试 malloc (1)两次或 malloc 除1以外的任何其他值、malloc 失败。

我在唯一通过的 malloc 返回的指针处检查了内存浏览器、看起来有很多未使用的内存(全为零)。

我之所以包含 cmd 文件、是因为我认为它与链接器文件或已关闭的编译/链接设置有关。

请帮助、

谢谢、

Miguel

#ifdef CLA_C
//定义将由
CLA 编译器用于局部符号和 temps 的 CLA 暂存区的大小
//还强制引用标记
了//暂存区的特殊符号。
CLA_ScratchPad_size = 0x100;
--undef_sym=__cla_scratchpad_end
--undef_sym=_cla_scratchpad_start
#endif //cla_C


MEMORY
{
/* begin 用于"引导至闪存"引导加载程序模式*/
begin :origin = 0x080000、length = 0x000002
boot_RSVD :origin = 0x000002、length = 0x0001AE // M0的一部分,引导 ROM 将此用于栈*/
RAMM0 :origin = 0x0001B0、length = 0x000250
RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 *//
RAMD0 :origin = 0x00C000、length = 0x000800
// RAMD1 :origin = 0x00C800,length = 0x000800
RAMD0_1 :origin = 0x00C000、length = 0x001000
RAMLS0 :origin = 0x008000、length = 0x001000
// RAMLS0 :origin = 0x008000、length = 0x000800
// RAMLS1 :origin = 0x008800,length = 0x000800
RAMLS2 :origin = 0x009000、length = 0x000800
RAMLS3 :origin = 0x009800,length = 0x000800
RAMLS4 :origin = 0x00A000、length = 0x000800
RAMLS5 :origin = 0x00A800,length = 0x000800
RAMLS6 :origin = 0x00B000、length = 0x000800
RAMLS7 :origin = 0x00B800,length = 0x000800

RAMGS0 :origin = 0x00D000、length = 0x005000
// RAMGS0 :origin = 0x00D000、length = 0x001000
// RAMGS1 :origin = 0x00E000、length = 0x001000
// RAMGS2 :origin = 0x00F000、length = 0x001000
// RAMGS3 :origin = 0x010000,length = 0x001000

// RAMGS_4 :origin = 0x011000,length = 0x004000

// RAMGS4 :origin = 0x011000,length = 0x001000
RAMGS5 :origin = 0x012000,length = 0x004000
// RAMGS5 :origin = 0x012000,length = 0x001000
// RAMGS6 :origin = 0x013000、length = 0x001000
// RAMGS7 :origin = 0x014000、length = 0x001000
// RAMGS8 :origin = 0x015000,length = 0x001000
RAMGS9 :origin = 0x016000,length = 0x001000
RAMGS10 :origin = 0x017000、length = 0x006000
// RAMGS10 :origin = 0x017000、length = 0x001000
// RAMGS11 :origin = 0x018000、length = 0x001000
// RAMGS12 :origin = 0x019000、length = 0x001000
// RAMGS13 :origin = 0x01A000、length = 0x001000
// RAMGS14 :origin = 0x01B000、length = 0x001000
// RAMGS15 :origin = 0x01C000、length = 0x001000

//闪存扇区*/
FLASHA :origin = 0x080002、length = 0x001FFE//片上闪存*/
FLASHB :origin = 0x082000、length = 0x002000//片上闪存*/
FLASHC :origin = 0x084000、length = 0x002000//片上闪存*/
FLASHD :origin = 0x086000、length = 0x002000//片上闪存*/
FLASHE :origin = 0x088000、length = 0x008000//片上闪存*/
FLASHF :origin = 0x090000、length = 0x008000//片上闪存*/
FLASHG :origin = 0x098000、length = 0x008000//片上闪存*/
FLASHH :origin = 0x0A0000、length = 0x008000//片上闪存*/
FLASHI :origin = 0x0A8000、length = 0x008000//片上闪存*/
FLASHJ :origin = 0x0B0000、length = 0x008000//片上闪存*/
FLASHK :origin = 0x0B8000、length = 0x002000//片上闪存*/
FLASHL :origin = 0x0BA000、length = 0x002000//片上闪存*/
FLASHM :origin = 0x0BC000、length = 0x002000//片上闪存*/
FLASHN :origin = 0x0BE000、length = 0x002000//片上闪存*/

CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800
CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800

CANA_MSG_RAM :origin = 0x049000、length = 0x000800
CANB_MSG_RAM :origin = 0x04B000、length = 0x000800

复位 :origin = 0x3FFFC0、length = 0x000002

CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080
}

SECTIONS
{
codestart :>开始,align (4)
.text :>> FLASHB | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN、ALIGN (4)
.cinit :> FLASHG,ALIGN (4)
//.cinit :> RAMLS1,ALIGN (4)
.switch :> FLASHG,align (4)
.reset :>重置,类型= DSECT /*未使用,*/
.stack :> RAMM1
DMARAML4:> RAMM0,PAGE = 0

#if defined (__TI_EABI _)

.init_array :> FLASHG,ALIGN (8)
.bss :> RAMGS0、ALIGN (4)
.bss:输出 :> RAMLS0,align(4)
.bss:CIO :> RAMLS0
.data :> RAMLS0
.sysmem :> RAMLS0/*
初始化段进入闪存*/
.const :> FLASHG、align (8)
#else
.pinit :> RAMLS0,align (8)
//.pinit :> FLASHG,ALIGN (8)
//.ebss :> RAMGS5
.ebss :> RAMGS0

//.ebss :> RAMLS0,align (4)
//.esysmem :> RAMGS10,align (8)
.esysmem :> RAMLS6 | RAMLS7,align(8)

.cio :> RAMLS6 | RAMLS7,align(8)
//初始化段进入闪存*/
.econst :> FLASHG、ALIGN (8)
#endif


//闪存编程缓冲器*/
BufferDataSection:> RAMLS5、ALIGN (8)


MSGRAM_CPU1_TO_CPU2:> CPU1TOCPU2RAM,type=NOINIT MSGRAM_CPU2_TO_CPU2
:> CPU2TO_CPU1,type=NOINIT

/* CLA 特定部分*/
#if defined (__TI_EABI __)
Cla1Prog :LOAD = FLASHF、
运行= RAMLS4 | RAMLS5、
Load_start (Cla1funcsLoadStart)、
LOAD_END (Cla1funcsLoadEnd)、
run_start (Cla1funcsRunStart)、
load_size (Cla1funcsLoadSize)、
align (8)
#else
Cla1Prog :LOAD = FLASHF、
运行= RAMLS4 | RAMLS5、
load_start (_Cla1funcsLoadStart)、
load_end (_Cla1funcsLoadEnd)、
run_start (_Cla1funcsRunStart)、
load_size (_Cla1funcsLoadSize)、
align (8)
#endif
ClaData:> RAMLS3


#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000

#if defined (_TI_EABI)

组{.TI.ramfunc{-l F021_API_F2837xD_FPU32.lib}
load = FLASHD、
run = RAMD0_1 | RAMGS5、
load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
load_end (RamfuncsLoadEnd)、
run_start (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
run_end (RamfuncsRunEnd)、
page = 0、align (8)
其他


组{.TI.ramfunc{-l F021_API_F2837xD_FPU32.lib}
load = FLASHD、
run = RAMD0_1 | RAMGS5、

load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
page = 0、align (8)

#endif

其他
组{ramfuncs{-l F021_API_F2837xD_FPU32.lib}}
load = FLASHD、
//run = RAMLS0、
run = RAMD0_1、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
page = 0、align (8)
#endif
#endif



Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW,type=NOINIT
CpuToCla1MsgRAM:>CLA1_MSGRAMIGH,type=NOINIT

/* SFRA 特定段*/
SFRA_F32_Data:>RAMGS9,CLA = 64

*

必须

为 CLA 分配内存/ CLA /

CLA 访问#64 / CLA / CLA * :
{*。obj (CLAscratch)
。 += CLA_ScratchPad_size;
*。obj (CLAscratch_end)}> RAMLS2


.scratchpad :> RAMLS2
.bss_cla :> RAMLS2


#if defined (__TI_EABI _)
.const_cla :LOAD = FLASHF、
运行= RAMLS6、

RUN_START (Cla1ConstRunStart)、
Load_start (Cla1ConstLoadStart)、
load_size (Cla1ConstLoadSize)、
align (8)
#else
.const_cla :LOAD = FLASHF、
运行= RAMLS6、
run_start (_Cla1ConstRunStart)、
Load_start (_Cla1ConstLoadStart)、
load_size (_Cla1ConstLoadSize)、
align (8)
#endif
#endif //cla_C

//使用 IPC API 驱动程序时需要以下段定义*/
组:> CPU1TOCPU2RAM
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

组:> CPU2TOCPU1RAM
{
GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT
}

} 

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

    请在链接器映射文件中查找符号 __SYSMEM_SIZE。  此符号的值是多少?

    谢谢、此致、

    乔治

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

    ABS  00000800 __SYSMEM_SIZE        

    我还跑了

      size_t totalSizeAvalente= __TI_heap_total_available ();
      size_t largestalsent= __TI_heap_large_available ();

    好的

    totalSizeAvalened=2.

    雪崩= 2

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

    发生了奇怪的事情。  请尝试另一个实验。

    编译器安装包括一个名为 dis2000的独立反汇编器。  它与编译器 cl2000位于相同的\bin 目录中。  典型的目录路径是...

    C:\ti\ccs1011\ccs\tools\compiler\ti-cgt-C2000_20.2.1.LTS \bin

    从命令行运行类似于...的命令

    % dis2000 project_execute_file.out > dis.txt 

    检查文本文件 dis.txt。  搜索名为  memalign 的函数。  你会看到类似的东西

    000001e7. aligned_alloc:
    000001e7 _memalign:
    000001e7 b2bd MOVL *SP++、XAR1
    000001e8 aabd MOVL *SP++、XAR2
    000001e9 a2bd MOVL *SP++、XAR3
    000001ea fe02 ADDK SP、#2
    000001eb 864c MOVL XAR2、*-SP[12]
    000001ec 8ba9 MOVL XAR1、ACC
    000001ed aaa9 MOVL ACC、XAR2
    000001ee 6111 SB 17、EQ
    000001ef 28a9 MOV AL、#0x0800
    000001f0 0800
    

    第一列是地址。  您的地址将会不同。  但其他一切都应该相似。  重要的细节是末尾的常数0x800  这是程序中编码的堆的大小。  您是否看到了同样的东西?  还是其他东西?   

    如果您在反汇编中看到0x800、那么下面是进一步的步骤。 在不运行程序的情况下加载程序。  检查应包含0x800的地址。  是这样吗?  在 memalign 开始处设置断点、然后运行到该断点。  此位置是否仍包含0x800?

    请告诉我您看到的内容。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    我通过将堆大小增加到0x1000来解决这个问题。 现在我的堆中有0x700 ish 空间、因此 malloc 和 new 可以正常工作。

    本周我有一个主要的截止日期、因此我将等待您的测试、直到下周结束。

    谢谢、

    Miguel

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

    好的。  我计划下周听取您的意见。

    谢谢、此致、

    乔治