你(们)好。
我正在努力将一些项目迁移到 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