我们的嵌入式系统建立在enea的硬件/软件平台上。在最近更新平台之后,我们发现对全局变量的某些操作使系统崩溃。

例如,我们有一个包含一些数据的全局地图结构。我们可以插入/迭代一次或两次映射,然后映射中元素的地址突然更改为某些禁止的地址,例如0x0或0x1d,这只会导致系统崩溃。

平台更新之前/之后的唯一不同是:
1)sw part:这是一个c ++软件,我们将编译器从diab cc更改为gcc。
2)硬件部分:我们有一块新主板,但是cpu仍然是powerpc405s。

我尝试了所有可能的方法,但仍然找不到原因。有什么想法吗?

最佳答案

全局变量的一个已知问题是初始化的顺序。通常不定义此顺序。结果,如果一个全局变量的ctor尝试使用另一个全局变量,则可能会崩溃。对于您而言,问题可能在于GCC已决定稍后在您使用地图之后初始化地图。

一种快速的解决方案是用单例替换全局:

MyClass& MyClass::instance() {
  static MyClass singleton;
  return singleton;
}


singleton是在函数返回之前创建的,因此肯定在使用之前创建。

关于c++ - 平台更改后全局变量不稳定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2910318/

10-16 04:29