Thread 中讨论的其他器件:C2000WARE
工具与软件:
您好!
我在构建 CLA 代码时没有出现任何错误或警告。 项目的 cmd 文件将代码存储在闪存中、并从 RAM 运行。 但当我查看工程的映射文件时、它会将代码存储在 RAM 中、并从相同的地址执行。 长度为0。 cmd 文件中的加载值与我们用于其余代码的加载值相同。 那么、有两个问题:
为什么它同时为加载地址和运行地址使用 RAM 值?
长度为什么为0?
谢谢!
据
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.
工具与软件:
您好!
我在构建 CLA 代码时没有出现任何错误或警告。 项目的 cmd 文件将代码存储在闪存中、并从 RAM 运行。 但当我查看工程的映射文件时、它会将代码存储在 RAM 中、并从相同的地址执行。 长度为0。 cmd 文件中的加载值与我们用于其余代码的加载值相同。 那么、有两个问题:
为什么它同时为加载地址和运行地址使用 RAM 值?
长度为什么为0?
谢谢!
据
尊敬的 Ed:
您是否正在使用 C2000ware 中的2838x_flash_cla_lnk_cpu1.cmd 文件(未进行修改)? 此外、为了进行验证、您已将项目切换到闪存构建、对吗? 要执行此操作、请右键点击工程>> Build Configurations >> Set Active >> CPU1_FLASH。
它在映射文件中的哪个位置显示了该内容? 当您使用闪存构建编译 CLA 工程时、Cla1ProgLoadStart 应该是闪存中的位置、Cla1ProgRunStart 应该是 LSRAM 位置、如下所示:
此致、
Delaney
尊敬的 Delaney:
这发生在我们的产品项目中、而不是示例项目中。 我已经使用示例项目作为我们的参考、并将适当的 cmd 文件项复制到我们的 cmd 文件中。 我认为无关紧要、但我们使用 COFF 输出。 因此、对于 Cla1Prog、在 cla_ex1_asin 示例项目中、我们使用的是:
Cla1Prog : LOAD = FLASH4、
RUN = RAMLS5、
Load_start (_Cla1funcsLoadStart)、
Load_End (_Cla1funcsLoadEnd)、
RUN_START (_Cla1funcsRunStart)、
Load_Size (_Cla1funcsLoadSize)、
对齐(8)
并将其修改为:
Cla1Prog : 负载= 、
Run = RAMLS6、
Load_start (_Cla1funcsLoadStart)、
Load_End (_Cla1funcsLoadEnd)、
RUN_START (_Cla1funcsRunStart)、
Load_Size (_Cla1funcsLoadSize)、
对齐(8)
其中 our_code_area 位于包含其余代码的闪存空间。
在示例工程中、我在.cla 文件中没有看到 Cla1Prog 段语句。 因此、除了编译器用户指南之外、我不知道 CLA 代码如何与 Cla1Prog 部分关联、因为编译器用户指南表明它会自动给定 Cla1Prog 部分。
谢谢!
据
尊敬的 Ed:
仅供参考、C2000ware 中针对每个器件的所有给出/建议的链接器 cmd 文件都位于以下文件路径中:[C2000ware install]/device_support/f2838x/common/cmd/。
DATA_SECTION pragma 只应在 C 文件中定义、并且只适用于要放置在共享内存中的特定变量(这必须由主 CPU 来完成)。 如果您已在链接器 cmd 文件中包含 Cla1Prog 语句、那么您 无需添加 DATA_SECTION pragma 即可将 CLA 程序分配到正确的存储器。 CLA 编译器知道要在链接器 cmd 文件中查找 Cla1Prog 段、因此不需要在其他任何位置定义它。
要具有 CLA 支持的链接器 cmd 文件、您还需要在 BSS_CLA、CONST_CLA、暂存区段的段定义中添加。 您可能会感兴趣。 如果您已经有这些、请在此处发送链接器 cmd 文件(作为文件)、然后我将看看是否需要添加任何其他内容。
还要验证您的项目属性中是否启用了 CLA_support。
此致、
Delaney
尊敬的 Delaney:
感谢您的参考。 我一直在使用该区域的 cla_ex1_asin 项目作为我的参考。
我感觉 Cla1Prog 段是自动创建的、就像.text 段那样、但在文档中找不到任何可验证的内容。
我有除.const_cla 之外的所有这些项、因为我还没有需要它。 (在代码开发过程中、稍后会用到它。) 我已附加了一个版本的 cmd 文件,我们的 IP 已被删除。 我将其扩展名为.txt。
cla_support 设置为 cla2。
谢谢!
据
尊敬的 Delaney:
希望您有一个美好的假期。
三个方面:
我已将该项目缩减至非常小的项目、并且不包含我们的 IP、但仍与问题重复。 如果需要帮助、我可以将其压缩并发送给您。
作为一个实验、我为 CLA 创建了一个汇编文件、并把一个带有指令的函数放在其中。 该问题在映射文件中显示、包含预期的大小以及用于加载和运行的合理地址。 因此、我还需要在 CLA 文件或 CLA 文件的选项中执行其他操作、以便编译器/链接器将代码放入输出中。
作为额外的实验、在汇编文件中、我还创建了一个名为_Cla1Task1的函数、并将其设置为全局函数。 这导致了链接错误、这意味着链接器可以在 CLA 文件中看到该例程。 但某种因素会阻止它放置在最终代码中。
谢谢!
据
尊敬的 Delaney:
我已附加该文件。 您需要重命名它以为其提供 zip 扩展名。
我尚未编写代码以将其复制到 LS RAM、因为映射文件中的长度为零。 但这里有两件事是令人感兴趣的。 第一个是 lst 文件显示非零长度的代码。
第二种是当我用汇编语言编写一些 CLA 代码时、它确实会显示在映射文件的长度字段中。
谢谢!
据
尊敬的 Ed:
下载.txt 并重命名为 zip 后、我遇到了解压 zip 的问题。 E2E 应该允许您使用 Insert >> Image/video/file> Upload 将 zip 文件附加到响应中、可以尝试一下吗?
此外、详细查看链接器 cmd 文件后、我认为您仍然想添加 SECTIONS 指令 CONST_CLA、以防链接器将您的 CLA 代码的一部分视为属于这些段之一。 如果链接器不知道将其放置在何处、则可能会导致一些奇怪的行为。
此外、我想我之前提到过这一点、但只是想确保您在构建之前切换到 Build Configurations >> Set Active >> CPU1_FLASH、是正确的吗?
此致、
Delaney
尊敬的 Ed:
只是更新一下、我目前正在研究这个问题。 我仍然无法准确地缩小导致 代码中 Cla1funcsLoadSize 为零的范围。 出于好奇心、如果你没有遇到任何构建错误、 当你连接至调试器(用于你的完整代码)时、你的 CLA 任务是否能够执行? 因为初始化 CLA 并且没有权限(也没有 driverlib 支持等)的 C28x 代码、所以我很难用削减项目来尝试这一点。
此致、
Delaney
尊敬的 Delaney:
感谢您的参与。
我们未遇到构建错误。 我没有尝试执行 C 语言代码、因为长度是0 (没有要复制到 CLA RAM 中的内容)。
但在这种情况下、我编写了一些具有长度和合理值的汇编代码。 几分钟前、我能够使用任务的软件启动来执行我的第一条指令。 该指令只是 MSTOP、因此我还没有在执行方面做很多事情。
很抱歉、我没有更多可提供的。
谢谢!
据
尊敬的 Ed:
我仍在研究这个问题。 为了验证、您是否在此项目中使用了本线程中为编译器选项提供的解决方案: (+) TMS320F28388S:CLA 文件可以在 C++项目中编译? - C2000微控制器论坛- C2000 ︎ 微控制器- 用于为 CLA 编译 C++代码的 TI E2E 支持论坛?
此致、
Delaney
尊敬的 Delaney:
感谢您的支持!
为了进一步工作、我 一直使用 CLA 汇编语言开发代码。 出于性能方面的考虑、我相信我会继续使用该语言。
不过、在将来、我们可能还想在 CLA 上运行其他项目、而不必以汇编语言编写这些项目会很好。
但回到您的问题、我为您提供的项目不会有这种变化。 它 会导致我们的内部版本中出现其他问题。 但我认为在需要修复时、我们可以修改相应的文件、从而不再需要该选项。
很抱歉、我无法为您提供更多帮助。
此致、
据
尊敬的 Delaney:
我无法使用 C 语言编译、因为我们的代码是用 C++编写的。 我试图引入较旧的代码、其中 CLA 代码是用 C 语言编写的、但与 CLA 汇编中的新代码有太多冲突。 很遗憾、用我们最新的代码构建代码并不是目前可行的。 但我预计仍然会失败。 我发送给您的这个小项目确实复制了这个问题。
您提到了另一个主题。 那是什么线程?
抱歉、我没有为您提供的更多信息、
据
尊敬的 Ed:
我在这里讨论了这个线程: (+) TMS320F28388S:CLA 文件可以在 C++工程中编译吗? - C2000微控制器论坛- C2000 ︎ 微控制器- TI E2E 支持论坛 。 再次查看后,我意识到我误解了这个线程。 编译器专家的指令允许您使用 C++编译除 CLA 文件之外的所有内容、CLA 文件可以 用 C 语言编写(和编译)
我仍然怀疑这些编译器配置可能是空 CLA 代码的原因。 您能否询问此问题/链接该线程上的示例代码、以便编译器专家进行加权?
此致、
Delaney
尊敬的 Delaney:
该主题似乎已锁定、因为我无法添加到该主题。
但我已将简化的工程附加到该线程中。 我希望有一种方法可以将其连接到另一线程。
谢谢!
据
尊敬的 Ed:
为了进行更新、我一直与编译器专家合作、我能够在您发送的缩减项目中修复该问题。 由于 main.cpp 文件中没有引用 CLA 任务符号、因此链接器本质上是在丢弃函数定义。 要解决削减项目中的问题、您可以执行以下操作:
您的常规项目的 main.cpp 中是否有这些参考资料? 为了正确设置 CLA、你必须以这种方式引用符号、所以如果这样做、这不是你的问题。 但是、如果你还没有将所有 CLA 配置添加到 main.cpp 文件中、这就是映射文件缺少你的 CLA 程序代码的原因。
此致、
Delaney
尊敬的 Delaney:
我对反应迟缓表示歉意。
我找到了一个旧版本的项目,我已经存档和忘记。 很抱歉、我没早点找到它。 其中包含.cla 文件、以及我为 CLA 创建的 asm 文件的开头。 构建中包含 asm 文件后、我可以看到代码大小。 如果我排除它、以便 CLA 文件是唯一生成的文件、那么大小为0。
因此、我已排除 asm 文件并修改了系统、以便代码将 Cla1Task1分配给 MVECT1。 我还尝试了像您一样将其分配给临时变量。 结果与之前相同、长度为0。 我以前没有注意到的是 LoadStart 和 LoadEnd 的值位于 RAM 中、而不是闪存中。 使用汇编文件时、LoadStart 和 LoadEnd 位于闪存中、RunStart 位于 RAM 中。 这可能是一个线索。
谢谢!
据
尊敬的 Ed:
我相信、如果 CLA 程序大小被认为是0、则链接器会将 LoadStart 和 LoadEnd 放在 默认位置、即使您指定 CLA 代码加载到闪存中、该位置也可能在 RAM 中。 如果您在映射文件中搜索"Cla1Task"符号、它会显示吗? 否则、问题仍然可能是编译器出于某种原因而丢弃符号。
对于已归档项目中使用的编译器标志是否有任何差异? 您是否能够通过 E2E Messenger 向我发送项目? 或新存档项目的精简版本?
此致、
Delaney
尊敬的 Delaney:
我已经把我找到的项目放到最低限度、它使用您建议的主代码复制了问题。 但它仍然没有在映射文件中放入 Cla1Task1。
因此、在编译器优化掉了一条主指令的假设下、我更改了 main、以返回 Cla1Task1的地址。 这会导致链接错误、因为它无法找到 Cla1Task1。 但 Cla1Task1现在显示在映射文件中、但作为 UNDEFED。 我已附上一个新工程的 zip 文件。 我希望这对您有所帮助。
谢谢!
据