0

我正在使用 CodeSourcery GCC 4.5.2 for ARM 为 STM32 编写 C 代码。我在初始化全局结构时遇到问题。代码如下。

在 struct.h

typedef struct
{
  int foo;
  ...
  int bar;
} mystruct;

extern mystruct example; 

在 struct.c 中

mystruct example = {100,200 ..., 1000};

在 Main.c 中

#include "struct.h"

int temp;
temp = example.foo;

代码编译没有任何问题。但是在调试的时候,我发现这个结构已经被所有的垃圾值初始化了!!temp 的值应该是 100,但它总是被证明是一个垃圾值。我在 PC 上使用 eclipse + openOCD + GDB 硬件调试,在硬件端使用 Olimex JTAG。

这是编译器的问题吗?或者我在这里错过了什么?

4

3 回答 3

1

问题已解决。我正在为 STM32 使用自定义链接器脚本,它增加了对 C++ 的支持。我在链接器文件中注释掉了以下行,并且神奇地全局结构开始使用提供的值进行初始化!

__exidx_start = .;
.ARM.exidx : 
{
    *(.ARM.exidx* .gnu.linkonce.armexidx.*)
} >flash
__exidx_end = .;

.preinit_array : {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
} >flash

.init_array : {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
} >flash

.fini_array : {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
} >flash

我不知道上述几行究竟做了什么(除了它们是 C++ 构造函数工作所必需的)。即使项目中的所有源文件都没有任何 C++ 代码,我仍然想知道,链接器文件中的这个特定代码是做什么的,以至于我的全局结构被初始化为垃圾值?

于 2012-11-07T09:26:34.883 回答
1

struct 对象的赋值发生在运行时,与编译时相反,因为全局变量在编译时被初始化。如果编译器没有捕捉到错误,它将用垃圾值初始化全局变量。Bugfree 编译器将捕获此错误

于 2012-11-07T07:53:37.303 回答
0

只需确保您.c在编译期间提供这两个文件并只制作可执行文件就可以了。我尝试使用我的 gcc 4.5.2

主文件:

cat gst.c
#include<stdio.h>
#include "gst.h"
int main()
{
int temp;
temp = example.foo;
printf("%d\n",temp);
return 0;
}

另一个文件 c 文件

cat ggst.c
#include"gst.h"
mystruct example = {100,200};

gst.h 文件:

typedef struct
{
  int foo;
  int bar;
} mystruct;

extern mystruct example;

gcc -Wall -Werror gst.c ggst.c -o g

./g

输出为 100

于 2012-11-07T07:25:46.793 回答