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));
}
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
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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。