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.

[参考译文] TMS320F28388D:C++编译器生成的__STI 函数在调用构造函数之前不会复制到 RAM 中

Guru**** 2422790 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1545996/tms320f28388d-c-compiler-generated-__sti-functions-not-copied-into-ram-before-constructor-is-called

器件型号:TMS320F28388D


工具/软件:

您好、

我发现有关编译器生成的“__sit__"函“函数的信息非常少。
我有一些代码段,它们被加载到 RAM 中的 main ()( binit 表)之前。
如果我有一个也加载到 RAM 段中的全局构造函数、程序会崩溃、因为链接器在调用构造函数之前不会将__sti__函数复制到 RAM 中。

我尝试简化代码的结构:

main.cpp ->从闪存运行

#include "ram_funcs.h"

static MyClass myInst = MyClass();

int main()
{
...
}

ram_funcs.h

class MyClass
{
    MyClass();
}

ram_funcs.cpp ->从 RAM 运行 (load=flash run=RAM)

MyClass::MyClass()
{
...
}

链接器将“ram_funcs.cpp"中“中的对象放入二进制表中、但不将__sit__函数放入。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很少发现有关编译器生成的“__siti__"函“函数的信息。

    请阅读 此论坛帖子的后一部分。  重点了解有关 由编译器自动生成的函数的部分、这些函数在类的全局实例上调用构造函数。  这些是__STI__函数。   

    为了避免一个可能的混淆点...该论坛帖子是旧的。  它将指向__sit__函数的指针描述为位于该段中 .pinit 。  旧版 COFF ABI 中都是如此。  您很可能使用较新的 EABI。  在 EABI 下、段名 .init_array 转换器 .pinit

    如果我有一个也加载到 RAM 段中的全局构造函数、程序会崩溃、因为链接器在调用构造函数之前不会将__sti__函数复制到 RAM 中。

    构造函数 MyClass() 位于 RAM 。  它是从此处复制的 闪存中 静电放电。  所有这些函数都是从复制过来的 闪存中 最终目的 RAM 在调用任何__sit__函数之前。  我认为相关的__sti__函数位于闪存中、就像一样 主要 。  此__sit__函数在系统启动期间调用。  然后调用构造函数 MyClass() 、它位于 RAM 中。  这可能比最佳速度慢、但我不明白为什么会导致崩溃。  使用 MyClass() 还能打电话吗?

    谢谢。此致、

    -乔治

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

    您好、George、

    感谢您的回答:)
    我试图简化这个问题,并且忘记了,许多模块也手动加载到 RAM 中。
    程序是我们的引导加载程序。
    我们在内部闪存中为其保留了很小的空间。 引导加载程序的其余部分从 main.cpp 中的外部闪存加载到 RAM 中

    更新了结构

    - main.cpp ->加载/运行内部闪存
    - programFlash.cpp ->加载内部闪存、运行 RAM
    - fw_update.cpp ->外部闪存,在 main () 之后手动加载到 RAM 中;

    在 FW_UPDATE 中,我想使用 programFlash 中的类的全局构造函数。
    这不起作用、因为它是与__STI__函数一起手动加载的。

    我想将 FW_UPDATE 的部分内容链接到内部闪存中,以便在调用 main() 之前初始化实例。
    我现在摆脱了全局构造函数并在稍后的 main 中初始化实例。

    谢谢、

    福克