2012/04/14

[arm]gccバージョンの違い

雑誌InterfaceのARM基板(2009年5月)。
IAR社は制限付きながらも統合開発環境がある。
それもいいのだけど、うちではデバッガがないのでそんなに利点がない。
ならば、制限無しのgccがいいんじゃなかろうか。
そんなわけで、gccを使うことにしている。

CQ出版の特設サイトを見ながら環境構築。
gcc環境の説明はここにあった。
ここではcygwinを使うようになっていた。
別にそれでもいいのだけど、フリーのARMコンパイル環境は何となくCodeSourceryかな、と思っている。
(いつの間にかMentorになってる…知らんかった…。)

当時のgccと、今のCodeSourcery gccを比べてみよう。

arm-elf-gcc (GCC) 4.3.1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


arm-none-eabi-gcc.exe (Sourcery CodeBench Lite 2011.09-69) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


4.3.1から4.6.1に上がっている。
では、ビルド結果はどうだろう。サンプルソースをそのままビルド。
最適化指定はしてない。。。ので、-O0扱いと同じようだ。

4.3.1
.text          0x0000005c      0x1f0 gcc_sample.o
               0x0000008c                CPU_DisableInterrupt
               0x000000bc                CPU_IRQInterrupt
               0x0000012c                main
               0x0000005c                CPU_EnableInterrupt
               0x0000024c                _etext = .

CPU_EnableInterrupt : 48byte
CPU_DisableInterrupt : 48byte
CPU_IRQInterrupt : 112byte
main : 288byte

4.6.1
*(.text)
.text          0x0000005c      0x1cc gcc_sample.o
               0x0000005c                CPU_EnableInterrupt
               0x00000090                CPU_DisableInterrupt
               0x000000c4                CPU_IRQInterrupt
               0x00000134                main
               0x00000228                _etext = .

CPU_EnableInterrupt : 52byte
CPU_DisableInterrupt : 52byte
CPU_IRQInterrupt : 112byte
main : 244byte

4.6.1の方が小さくなっている。
が、main以外は4.3.1の方が小さめだ。
何が違うんだろう?

比較しようかと思ったが、めんどくさくなってやめた。
最適化の有無だけ見ようかと-O3すると、4.6.1ではmain自体がなくなったので、やっぱりやめた(4.3.1には残ってた)。
本職でこういう作業をしなくなったときに見直そう。
見直すとき用に、-O3時の結果だけ置いておく。


Cソース
void CPU_EnableInterrupt()

{

  volatile unsigned int CPSR_val;

  asm ("MRS %0, CPSR": "=r" (CPSR_val):);

  CPSR_val &= ~0x80;

  asm ("MSR CPSR, %0": :"r" (CPSR_val));

}
4.3.1
sub    sp, sp, #4

MRS r3, CPSR

str    r3, [sp, #0]

ldr    r2, [sp, #0]

bic    r2, r2, #128

str    r2, [sp, #0]

ldr    r3, [sp, #0]

MSR CPSR, r3

add    sp, sp, #4

bx    lr
4.6.1
sub    sp, sp, #8

MRS r2, CPSR

str    r2, [sp, #4]

ldr    r1, [sp, #4]

bic    r0, r1, #128

str    r0, [sp, #4]

ldr    r3, [sp, #4]

MSR CPSR, r3

add    sp, sp, #8

bx    lr

フレームのために、4.3.1は4byte、4.6.1は8byte使っているように見える。
でも、実際に使っているのは4byte分だけ・・・?
そういえば、gcc4って中間コードを吐いた後でも最適化する段があったような。
なんかもう、感覚的にわかりにくくなってきたな。

CodeSourcery用にサンプルを書き換えた。

オリジナルは、Interface誌の付録。
  • LPC23xx.hを使うようにした
  • 割り込み禁止/許可をマクロにした(参考サイト)
まーだ、よくわかってないです。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。