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.

[参考译文] F28M35H52C:将参数传递给从闪存复制到 RAM 的函数。

Guru**** 2391415 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/678424/f28m35h52c-passing-arguments-to-a-function-that-was-copied-from-flash-to-ram

器件型号:F28M35H52C

你好。

我遇到了一个在闪存中加载但从 RAM 执行的函数问题。 需要注意的是、调用它时、并非所有参数都正确传递。 我不确定原因、但我知道问题与从 RAM 运行的事实有关、因为当我从闪存加载并运行它时、它工作正常。

奇怪的是、函数接收3个参数、所有这些参数都是指针、但只有一个参数传递错误、似乎始终是最后一个参数(我尝试修改顺序并意识到这一点)。

在寻找答案时、我发现了这个主题、在这个主题中、我很安静地确定被询问的人有完全相同的问题:

我并不担心在将函数加载到闪存中时必须设置哪些内容才能从 RAM 正确运行函数。 但是、在我的情况下、不能使用 ramfunc 属性、因为它们不适合 RAM (即使我使用共享的 RAM)、因此它们不能同时放置在该存储器中。 根据某些输入、我调用不同的函数、以便在需要使用 copy_in (...)时将它们复制到那里 和 copy_table 变量。

 当使用 copy_in 机制来实现某些函数的 RAM 放置时、是否还需要做一些额外的事情来使函数调用正常工作? 我按照 spraa46a 文档执行此操作、似乎还可以、但当我向函数添加更多参数时、结果出现了问题。

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

    这似乎是一个非常有趣的情况、我以前从未见过。 我将在这里进行一些挖掘、看看我是否能理解可能发生的情况。 我也是一位编译器专家、因为这似乎绝对是一个高级主题。

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

    我一直在思考这个问题、并从我们的编译器专家那里获得了一些反馈。 将函数从闪存复制到 RAM 似乎不会出现任何问题。

    在函数调用之前、您传递到函数中的指针值可能会被覆盖。 即调用 copy_in 函数会覆盖指针引用的存储器位置。

    您是否能够检测参数何时"变差"? 在调用 copy_in 函数之前、以及之后、在 CCS 的内存浏览器中观察指针引用的内存位置。

    -Mark
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、很抱歉我耽误了时间。 关于您所说的话:
    "也许您传递到函数中的指针的值在函数调用之前被覆盖。 即调用 copy_in 函数会覆盖指针引用的存储器位置。 "
    我认为这不是发生的。 我在程序开始时调用 copy_in 函数、然后调用 malloc 为指针分配内存、然后将其作为参数传递给某些函数。 大多数函数都可以正确处理这一问题、但并非所有函数都可以。 最后、我通过仅传递一个指针和该指针引用的其他指针来"求解"这一点。
    "您是否能够检测参数何时"变差"? 在调用 copy_in 函数之前、以及之后、在 CCS 的内存浏览器中观察指针引用的内存位置。"
    我认为我没有正确解释这个问题。 问题不是内存位置被覆盖或以某种方式丢失。 问题是、我将一个指针传递给函数、而应该具有该值的局部变量具有不同的值。 但原始指针引用的存储器位置会正确保存其信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好。

    很难想象这里发生了什么。 我想我现在已经理解了。 如果我错了、请更正我:
    只需说明问题:当您将指针传递给函数时、应该加载到局部变量中的值不是。

    您能否单步执行反汇编并观察上下文切换? 查看是否为函数调用正确加载了正确的 CPU 寄存器值、以及是否在函数开始时将正确的值加载到局部变量中。 这可以告诉我们该值何时损坏。

    这是否仅发生在一个函数上?
    每次调用函数时都会发生这种情况吗?

    您说过您"通过仅传递一个指针和此指针引用的其他指针来解决此问题"、您是说您找到了解决此问题的方法吗? 如果是、您已删除 malloc 调用、问题已解决?

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

    自你上次答复以来已经有几天了。 我将继续并关闭该线程。 如果您仍有其他意见或问题、请拒绝此解决方案、并发表包含有助于调试的任何其他信息的回复。

    谢谢、
    标记