0

ARM用のCodeSourcery GCC 4.5.2を使用して、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

struct オブジェクトの割り当ては、グローバル変数がコンパイル時に初期化されるコンパイル時とは対照的に、実行時に発生します。コンパイラがエラーをキャッチしない場合、コンパイラはグローバル変数をガベージ値で初期化します。Bugfree コンパイラはこのエラーをキャッチします

于 2012-11-07T07:53:37.303 に答える
1

問題は解決しました。C++ のサポートを追加した STM32 用のカスタム リンカー スクリプトを使用しています。リンカー ファイルの以下の行をコメント アウトすると、魔法のようにグローバル構造が提供された値で初期化され始めました。

__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 に答える
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 に答える