5

ARM9プロセッサの基本的なCプログラムでグローバル変数を定義するときに問題が発生します。私はEABIGNUコンパイラを使用しており、12KBのエルフから生成されたバイナリは4GBです!問題はスキャッターファイルにあると思いますが、頭を動かすのに問題があります。

256KBのROM(ベースアドレス0xFFFF0000)と32KBのRAM(ベース0x01000000)があります

SECTIONS {
  . = 0xFFFF0000;
  .text : {
    * (vectors);
    * (.text);
  }
  .rodata : { *(.rodata) }
  . = 0x01000000;
  sbss = .;
  .data : { *(.data) }
  .bss  : { *(.bss) }
  ebss = .;
  bssSize = ebss - sbss;
}

そして私のプログラムは次のとおりです。

int a=10;
int main() {
  int b=5;
  b = (a>b)? a : b;  
  return b;
};

をローカル変数として宣言すると、つまり.dataセクションがない場合、すべてが機能します。大丈夫。どんな助けでも大歓迎です。

-2011年3月16日-
誰かがこれを手伝ってくれますか、私はどこにも行かず、マニュアル、フォーラムなどを読んだことがあります...
私のブート、コンパイルコマンド、およびobjcopyコマンドは以下に貼り付けられています

     .section "vectors"
reset:  b   start
undef:  b   undef
swi:    b   swi
pabt:   b   pabt
dabt:   b   dabt
    nop
irq:    b   irq
fiq:    b   fiq
  .text
start:
        ldr   sp, =0x01006000
        bl    main

stop:   b     stop

arm-none-eabi-gcc -mcpu = arm926ej-s -Wall -nostartfiles -Wall main.c boot.s -o main.elf -T \ scatter_file
arm-none-eabi-objcopy ./main.elf --output- target = binary ./main.bin
arm-none-eabi-objdump ./main.elf --disassemble-all> ./main.dis

4

3 に答える 3

2

問題が見つかりました。objcopy コマンドは、リンカ スクリプトに記述されているアドレス空間全体を、最小アドレスから最大アドレスまで、その間のすべてを含めて作成しようとします。次のように、ROM コードを生成するように指示できます。

objcopy ./main.elf -j ROM --output-target=binary ./main.bin

リンカースクリプトも少し変更しました

MEMORY {
  ram(WXAIL) : ORIGIN = 0x01000000, LENGTH = 32K    
  rom(RX)    : ORIGIN = 0xFFFF0000, LENGTH = 32K                    
}

SECTIONS {
  ROM : { 
    *(vectors);
    *(.text);
    *(.rodata);
  } > rom 

  RAM : {
    *(.data); 
    *(.bss);
  } > ram 
}
于 2011-03-17T07:24:10.160 に答える
1

アドレス 0x01000000 から始まり、少なくともアドレス 0xFFFF0000 までを含むファイルを作成しています。4GB近くあるのも不思議ではありません。あなたは何をしたい?データ セグメントが不要な場合は、オプション -R を使用してデータ セグメントを削除してみてください (ROM 初期化ファイルを準備している場合などによくあることです)。

于 2011-03-08T16:16:53.820 に答える