您好!
我的客户将 IsrRamfuncs 分配到不同的加载和运行位置、如下所示:
但它们会得到以下错误:
问题似乎是由 IsrRamfuncs size> RAML0和>RAML1引起的。
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.
您好!
我的客户将 IsrRamfuncs 分配到不同的加载和运行位置、如下所示:
但它们会得到以下错误:
问题似乎是由 IsrRamfuncs size> RAML0和>RAML1引起的。
我看到多件事都错了。 我想一次一个地址。
根据第一个帖子中的错误消息、输出段 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。 最后一行将此段分配给闪存存储器。
谢谢、此致、
乔治