原创 【原创奖励】DSP报错#10099-D程序将无法放入可用内存

2024-4-9 13:51 439 4 4 分类: MCU/ 嵌入式

问题

开发TMS320Fxxxxx出现以下问题:

#10099-D  program will not fit into available memory, or the section contains a call site that requires a trampoline that can't be generated for this section. placement with alignment/blocking fails for section ".cinit" size 0x1d page 0.  Available memory ranges: 2837xD_FLASH_lnk_cpu1.cmd
  • 网络上的解释

这个错误消息表明程序在可用内存中无法适应或者包含了一个需要生成跳板但无法为该部分生成跳板的调用点。主要问题似乎是与.cinit节的大小和放置相关。通常,这种问题可能是由于以下原因之一引起的:

内存不足:程序的大小超出了可用的内存范围。这可能是由于代码或数据量增加导致的。你可以尝试优化代码以减小程序的大小,或者寻找更大的内存容量。

节的排列和对齐:.cinit节可能要求的对齐或者分配方式与可用内存不匹配。你可以尝试调整.cinit节的放置或对齐方式,以使其符合可用内存的要求。

跳板生成问题:错误消息中提到的"trampoline"指的是一个跳板,用于在代码段中调用另一个代码段。可能是无法为某些调用生成这种跳板,这可能需要对代码或链接器设置进行调整。

针对这些问题,你可以采取以下步骤来解决:

检查代码大小:确认程序是否超出了可用内存范围。你可以使用代码大小分析工具来查看各个部分的大小,以确定哪些部分导致了内存溢出。

调整节的排列和对齐方式:尝试调整.cinit节的放置和对齐方式,使其符合可用内存的要求。这可以通过调整链接器脚本或者编译器选项来实现。

优化代码:检查代码是否存在冗余或者可以优化的部分。使用优化编译器选项可以帮助减小程序的大小。

查看链接器输出:查看链接器的输出信息,了解哪些部分导致了内存溢出或者跳板生成问题。链接器可能会提供更详细的错误信息,帮助你定位和解决问题。

增加内存容量:如果可能的话,考虑增加目标设备的内存容量,以容纳程序的大小。

  • 自己的总结和分析:
    点击错误,跳转到xxxx_FLASH_lnk_cpu1.cmd
    我们打开Memory Allocation窗口,看到.cinit 已经满了
    出现这种问题的主要原因是.cinit所在的内存块占用满了,也就是FLASHB 满了,我们可以进行修改。

解决方法

我们首先打开xxxx_FLASH_lnk_cpu1.cmd文件,找到下列代码的位置。

/* Allocate program areas: */ 
.cinit              : > FLASHB        PAGE = 0, ALIGN(8)//增加FLASHG,因为内存溢出
.text               : >>  FLASHB|FLASHC | FLASHD | FLASHE      PAGE = 0, ALIGN(8)
codestart           : > BEGIN       PAGE = 0, ALIGN(8)
/* Allocate uninitalized data sections: */
.stack              : > RAMM1       PAGE = 1
.switch             : > FLASHB      PAGE = 0, ALIGN(8)
.reset              : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */

然后把和.cinit同在 FLASHB的.text去掉 FLASHB。更改完后如下:

/* Allocate program areas: */ 
.cinit              : > FLASHB        PAGE = 0, ALIGN(8)//增加FLASHG,因为内存溢出
.text               : >> FLASHC | FLASHD | FLASHE      PAGE = 0, ALIGN(8)
codestart           : > BEGIN       PAGE = 0, ALIGN(8)
/* Allocate uninitalized data sections: */
.stack              : > RAMM1       PAGE = 1
.switch             : > FLASHB      PAGE = 0, ALIGN(8)
.reset              : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */

此时再编译,发现不报错了。

作者: 跋扈洋, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3925799.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /1 下一条