2015-12-31 (木)
* 有明
行ってきた.
* 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));;
として解決.まだ微妙なコード色々あるけどとりあえず少し余裕が出来た.