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.

[参考译文] TMS320F28377S:将 COFF 迁移到 EABI、初始化问题

Guru**** 2398695 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1190358/tms320f28377s-migration-coff-to-eabi-initialization-issue

器件型号:TMS320F28377S

你(们)好。

我正在努力将一些项目迁移到 EABI。

有相同的 C++代码、也有相同的 C++标准(03)。

唯一的变化是输出格式 COFF => EABI、并且为链接器引入了一些新段。

两种情况下的汇编都没有问题。 无警告。

问题是、最终的常量初始化结构在 EABI 中未完成。 在 COFF 编译中、所有值均按预期位于其位置。

为了更好地解释我的问题、我只需在内部发表具有重要评论的微型项目:

initvariables.h:

#ifndef INITVARIABLES_H_
#define INITVARIABLES_H_

#include <stdint.h>

class init_variables final
{
public:
    init_variables();
    ~init_variables();
    // here initialised consts do not generate symbols
    static const float c_Pi = 3.14f;
    static const float c_2Pi;   //initialized in *.cpp, what makes EABI issue
    static const float c_3Pi;
    static const uint32_t c_beef = 0xDEADBEEF;
    static const uint32_t c_var;

};

#endif /* INITVARIABLES_H_ */

initvariables.cpp

#include <initvariables.h>

// static initialisation
    const float init_variables::c_2Pi    = 2 * 3.14f; 
    const float init_variables::c_3Pi    = 9.42477796f;
    const uint32_t init_variables::c_var = 0x0A0B;

usevariables.h

#ifndef USEVARIABLES_H_
#define USEVARIABLES_H_


#include <initvariables.h>


class use_variables2 final
{
public:
    const float local_c_Pi;
    const float local_c_2Pi;
    const float local_c_3Pi;
    const uint32_t local_c_beef;
    const uint32_t local_c_var;
};

#endif /* USEVARIABLES_H_ */

usevariables.cpp <=问题出在这里

#include <usevariables.h>


volatile static const use_variables2 my_use_variables2a = { init_variables::c_Pi,   //EABI 3.14
                                                  init_variables::c_2Pi,            //EABI 0000
                                                  init_variables::c_3Pi,            //EABI 0000
                                                  init_variables::c_beef,           // EABI DEADBEEF
                                                  init_variables::c_var }; // goes to .ebss and gets before main initialization, EABI 0000

volatile static const use_variables2 my_use_variables2b = { 3.55f,
                                                            6.2f,
                                                            9.333f,
                                                            7,
                                                            8 }; // no symbol, FLASH placement, EABI ok


//COFF: pointed object at 0xAC00, fully initialized,
//EABI not complete!!! c_2Pi, c_3Pi, c_var are all 0
void* p1_use_variables = (void*)(&my_use_variables2a);
//pointed object at 0x00090000 (FLASH), coff ok, eabi ok
void* p2_use_variables = (void*)(&my_use_variables2b);

指针  P1_USE_variables 和  P2_USE_variables 都有助于在存储器空间中查找初始化的类 、因为映射文件中不会生成类的符号。

为什么我在没有构建工具发出任何警告的情况下获得不完整的数据(未完全初始化)?

此致、

Maciej

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

    感谢您提交这么多代码。  遗憾的是、我无法再现您描述的行为。  请将此源代码集成到具有问题行为的 CCS 项目中。  尽量简化项目。  按照文章 "共享项目 "中的说明创建项目的 zip 文件、而不是将其附加到您的下一篇文章中。

    谢谢、此致、

    乔治

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

    e2e.ti.com/.../InitConstness.zip

    您好!

    下面是可为 COFF 和 EABI 编译的非常简单的工程。

    谢谢、此致、

    Maciej

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

    感谢您提交 CCS 项目。  我能够再现同样的行为。  我提交 了 EXT_EP-11021 以对此进行调查。  欢迎您访问该链接。

    谢谢、此致、

    乔治

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

    感谢您提供这些信息。

    如何在修复此错误时获得通知? 我无法订阅。

    此致、

    Maciej

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

    请参阅 有关 SIR (软件问题报告)系统的常见问题解答。

    谢谢、此致、

    乔治