2015-11 << 2015-12 >> 2016-01

2015-12-31 (木)

* 有明

行ってきた.

DSC_0233.jpg

* avr-gccでmainの先頭の不要なレジスタ退避コードを消す

コンパイルされたmain関数を見ると,

.global    main
    .type    main, @function
main:
    push r5
    push r6
    push r7
    push r8
     ...
    push r17

みたいなのが付く.gcc 4.3くらいから -Os とかつけても消えなくなった.Cコンパイラとしては正しいのだけど,大抵の場合,main関数はreturnもexitもせず動き続けるしmainの再帰呼び出しもしないので消したい.tiny13aのプログラムメモリ1KBしか無いし...

gccの attribute で noreturnつければ良いらしい.

http://www.atmel.com/webdoc/AVRLibcReferenceManual/porting_1iar_porting_non_returning_main.html

ただ,今度は mainの戻り値がintではないという警告が出る.ならばと思って int にすると,今度はnoreturnなのにintを返すという警告が.

結局,

int main(void) __attribute__((OS_main));;

として解決.まだ微妙なコード色々あるけどとりあえず少し余裕が出来た.

2015-11 << 2015-12 >> 2016-01