【问题标题】:TI DSP: interfacing C++ and assemblyTI DSP:接口 C++ 和汇编
【发布时间】:2011-01-03 18:52:09
【问题描述】:

我发布了this Q to TI's 28xx DSP forum,但没有收到回复,我想这里可能有人知道。


我知道如何在汇编中编写函数,以便它们可以被 C 调用;如果 C 可调用名称为 foo(),则汇编函数名为 _foo()

如果我想使用 C++ 并在汇编中优化类方法怎么办?我怎么做?我认为唯一的主要问题是:

  • 命名
  • 访问“this”指针
  • 通过某种方式知道偏移量来访问类成员

如果我不想担心最后两个,那么也许我会编写一个静态成员函数并这样做:

class MyClass
{
  int x;
  static int _doSomething(int u); // implement this in assembly
public:
  inline void doSomething() { x = _doSomething(x); } 
  // lightweight C++ wrapper to handle the class member / "this" pointer stuff
};

【问题讨论】:

    标签: c++ assembly embedded ti-dsp


    【解决方案1】:

    this 指针作为附加参数传递给函数,使用平台上的标准调用约定。在我熟悉的所有平台上,它作为第一个参数传递,但我没有做很多 C++ 编码,所以我不确定标准是否能保证这一点。您可以随时在您的平台上反汇编一些 C++ 代码来确认。

    C++ 符号命名比在 C 中更痛苦,并且因编译器而异。我想您可以通过反汇编已编译的函数定义找出要使用的正确符号名称,只需确保:该函数是正确类的成员,并且具有正确数量和类型的参数。

    除非您真的需要在原地重现 C++ 函数,否则我可能只会制作一个标准 C 函数并在其声明周围执行通常的 extern "C" { ... }

    【讨论】:

    • 我同意,编写一个由类的方法在内部使用的标准 C 函数听起来要简单得多。但是,可能必须接受额外的方法调用,我不知道这是否重要。
    • @Skurmedel:通常,围绕 extern "C" 函数的 C++ 包装器将简单地调用具有显式附加 this 参数的 C 函数。让 C++ 包装器“内联”,您可能会避免额外的方法调用。
    • @Stephen:TI 编译器保证某些调用约定,例如在 28xx 系列中,寄存器 XAR4 和 XAR5 用于第一个和第二个指针参数。他们没有明确谈论 this,但我已经证实它的行为与 this 是隐藏的第一个参数一样。
    • 接受,因为我在 TI 留言板上得到的答案相似。
    【解决方案2】:

    您的编译器是否具有内联汇编语法?如果你有,它可能是最简单的选择,你可以让编译器处理函数命名和调用语法。

    另外,Stephen 建议将 C++ 方法编写为“简单”C 函数调用的内联包装器,这是一个很好的建议。 (你可能想让它只是一个普通函数,而不是你帖子中的静态成员函数,以获得一个简单的 C 接口。)

    【讨论】:

    • TI 的 DSP 编译器确实具有内联汇编,但 C/C++ 数据结构和汇编之间的接口非常差。 (相对于 Microchip GCC,它使用扩展的汇编语法并自动在 C/C++ 变量和汇编中使用的符号量之间进行接口。)
    【解决方案3】:

    我会找到依赖于编译器的标志并在 C++ 函数中编写程序集。通常有一些方法可以从汇编部分中引用局部变量。

    【讨论】:

    • 这是该编译器的主要失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多