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.

[参考译文] TMS320F28032:程序将不能装入可用内存中

Guru**** 2392095 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/932195/tms320f28032-program-will-not-fit-into-available-memory

器件型号:TMS320F28032

您好!

我的客户将 IsrRamfuncs 分配到不同的加载和运行位置、如下所示:

但它们会得到以下错误:

问题似乎是由 IsrRamfuncs size> RAML0和>RAML1引起的。

我不理解"RAML0+RAML1"大于 IsrRamfuncs、为什么它在下面仍然有错误报告?

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

    Howard、

    我认为语法应该是:  

    运行= RAML0 | RAML1

    运行>> RAML0 | RAML1、

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

    更改语法后会出现同样的问题。

    我想指出、RAML0和 RAML1不相邻。

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

    您是否遇到相同的错误或不同的错误? 您能否创建一个适合尺寸的大剖面、然后再试一下? 在段之间自动拆分可能存在一些问题。

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

    相同的误差。  

    如果我重写 CMD 文件并创建更大的单个段、这是很好的。

    为什么 CCS 无法自动将我的代码拆分为两个部分? 这两个部分总共足够大。

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

    Howard、

    我看到过类似的问题。 我将与 CCS 团队跟进。

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

    Santosh、

    此问题是否有更新?

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

    我看到多件事都错了。  我想一次一个地址。

    根据第一个帖子中的错误消息、输出段 IsrRamfuncs 的大小为0x902字、存储器范围 RAML0的大小为0x900字、RAML1存储器范围的大小为0x100字。  IsrRamfuncs 的输出段是否由一个文件中的单个输入段组成?  如果您不理解该问题、请阅读文章 链接器命令文件入门的第一部分 、了解术语 输出部分和 输入部分之间的区别

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    是我的问题、 在我的项目中、IsrRamfuncs 是我们的程序代码、但在 RAM 代码中运行定义 类似于 #pragma CODE_SECTION (我的函数"IsrRamfuncs");但"IsrRamfuncs"如此之大、超过0x900、RAML0的原始 CMD 配置在其他 RAM 位置的长度仅为0x900、 RAML1是0x100长度可以使用、我不想更改 RAM 空间配置、如何将 IsrRamfuncs 加载到 RAML0和 RAML1的联合体中?

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

    这条线由周华生开始。  我想您正在与 Howard 一起处理同一个问题。

    有一种解决方案可以解决您的问题。  但它需要一些重大变化。

    假设输出段 IsrRamfuncs 包含 在同一源文件中定义的多个函数。  对于该源文件、请添加编译器构建选项 -gen_func_subsections。  此选项使编译器将每个函数放入一个名称类似于  IsrRamfuncs:_name_for_function 的单独段中。  然后、可以将这些单独的段分配给不同的存储器范围。

    在链接器命令文件中,删除第一个帖子中显示的代码,并将其替换为类似于...的内容。

    IsrRamfuncs:load = FLASHD,
    运行>> RAML0 | RAML1、
    表(BINIT)、
    page = 0.binit
    
    :> FLASHD 

    这将创建一个名为 IsrRamfuncs 的输出段。  它由以名称 IsrRamfuncs 开头的所有输入段组成、例如 IsrRamfuncs:_name_for_function。  加载到 FLASHD 存储器范围中。  运行分配按顺序在存储器范围 RAML0和 RAML1之间进行分配。  拆分发生在输入段边界上。  在这种特定情况下、这意味着拆分发生在函数边界上。   

    在上一个系统中,从加载内存复制到运行内存的方法类似于...

    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize); 

    此方法假定运行分配和加载分配都是单个连续的存储器块。  因为运行分配是拆分的、所以不起作用。  请在源代码中找到这一行并注释掉。

    表(BINIT)使用链接器的一个称为复制表的功能。  这些复制表是如何将函数从闪存复制到 RAM 的。  要了解有关它们的更多信息、请在 C28x 汇编工具手册中搜索 标题为 "使用由链接器生成的复制表"的子章节。  总之、复制表可以处理加载存储器和/或运行存储器的分离分配。  BINIT 参数意味着 BINIT 复制表用于执行此复制。  BINIT 复制表由编译器 RTS 库中的启动代码自动处理。  如果该启动代码被另一种实现方式所取代、则此解决方案不起作用。

    BINIT 复制表位于名为.binit 的输出段中。  这是一个初始化的段、如.text。  最后一行将此段分配给闪存存储器。

    谢谢、此致、

    乔治