ようやくInterfaceの連載原稿をあげてひと段落したので、OSC関西に向けてKOZOSの開発を進めたい。
進めたいのだが。。。ちょっと別件でToppersをいじっている。なんとか移植できないかな。
う~ん、KOZOSもっと開発進めたいのだが。やりたいことはいっぱいあるのだけど仕事(本業のほうね)も忙しくて時間が無い。。。
Toppersおもしろいね。こちらは本業ではないのだけれど。
ようやくInterfaceの連載原稿をあげてひと段落したので、OSC関西に向けてKOZOSの開発を進めたい。
進めたいのだが。。。ちょっと別件でToppersをいじっている。なんとか移植できないかな。
う~ん、KOZOSもっと開発進めたいのだが。やりたいことはいっぱいあるのだけど仕事(本業のほうね)も忙しくて時間が無い。。。
Toppersおもしろいね。こちらは本業ではないのだけれど。
最近、鍋をするときに「レバー」を入れるのがけっこう好きだ。
「レバー鍋」でなく、あくまで「鍋にレバーを入れる」だ。本気でレバーを食べるのでなく、ちょっとアクセントとしてレバーを食べるというくらいの量で。
まあなんか鍋にレバーというだけで臭くなってしまいそうな感じがするけど、あまり安いレバーは避けて、あとは煮詰めないように注意すればそんなに臭くなることもない。。。と思う。ぼくは基本的に臭い食べ物は好きなので、無感覚になってるだけなのかもしれないけど。
あくまでレバーは少量で、メインにはせずに。あとレバー単体で食べると飽きるので、ホウレンソウとか一緒に食べるのがおすすめ。鍋にホウレンソウ入れるときは、緑色のうちに早めに上げて、苦味が抜けないように注意。きれいな緑のホウレンソウは、アブラものとか、味の強いものとかに合うよー。
あとレバーは、鍋に入れるなら鳥のレバーがいいですな。軽くゆでると歯ごたえが美味。ゆですぎないように注意。あと安すぎるレバーは避けたほうがいいかも。
ちょっと挑戦したいことがあって5/15締め切りなのでその準備で時間をとっちゃっててKOZOSの開発が進んでいないのだけど、移植先をもっと増やしたい。
で、移植先のターゲットなのだけど、Interface誌の付録ARM基盤がいいかなーと思っている。なんにせよ安価に手に入るし、資料は豊富(Interface本誌を見ればいい)だし、KOZOSのポリシー(安く、シンプルに)にはいいのではないかと。
最近MIPSのアセンブラを読み書きしているのだけど、やっぱしいろんなアセンブラを読み書きできないといかんと思う。で、ARMとかやってみるのもいいかなーと思う。
あと釣りに行きたい。湖釣りか、川釣り(渓流じゃなく、下流の広い川)が好き。湖畔のオートキャンプ場でクルマとめた目の前で釣りができる、というのが理想。それでだらだらと釣りして、テナガエビとかウナギとか釣って七輪で焼いてその場で食べられるといいなー。もちろんルアーでなくエサ釣りで(なにがもちろんなんだかわけわからんが)。諏訪湖とかいいんだけど、湖畔にキャンプ場無いんだよね。。。
移植編の第6回 ~第7回 で、gccの-pgオプションによるプロファイラ機能を利用して関数呼び出しのログを取る方法を紹介したのだけど、実例で学ぶGCCの本格的活用法 をちょっと調べたら、実は gcc では -finstrument-functions というオプションを付けることで関数の入り口と出口で以下の関数を自動的に呼ぶようにできることが判明。
void __cyg_profile_func_enter(void *func_addr, void *call_site);
void __cyg_profile_func_exit(void *func_addr, void *call_site);
とくに関数の出口に関しては、第7回 では戻り先のアドレスを書き換えることで強制的に_mcount()側に戻しているのだけど、-finstrument-functions ならば直接関数を呼び出すようなので確実だし、CPU依存は無いしでいいことづくめ(第6回 ~第7回 のほうでは_mcount()をアセンブラで書いているので、CPUべったりなのだ)。
実例で学ぶGCCの本格的活用法 のほうはざっと読んだ感じ、gccのオプションは、他にもおもしろそうなのがいっぱいある。
うーん、いろいろ知らんといかんねえ。
.text
.globl _mcount
.type _mcount,@function
_mcount:
stwu 1,-48(1)
stw 3,16(1)
stw 4,20(1)
stw 5,24(1)
stw 6,28(1)
stw 7,32(1)
stw 8,36(1)
stw 9,40(1)
stw 10,44(1)
mflr 3
stw 3,8(1)
bl logging_begin
lwz 10,8(1)
mtlr 10
lwz 3,16(1)
lwz 4,20(1)
lwz 5,24(1)
lwz 6,28(1)
lwz 7,32(1)
lwz 8,36(1)
lwz 9,40(1)
lwz 10,44(1)
blrl
stw 3,16(1)
stw 4,20(1)
lwz 3,8(1)
bl logging_end
lwz 10,52(1)
mtlr 10
lwz 3,16(1)
lwz 4,20(1)
addi 1,1,48
blr
void logging_begin(int addr)
{
if (!logging_disable) {
logging_buf[logging_cur++] = addr;
if (logging_cur >= LOGGING_BUF_SIZE)
logging_cur = 0;
}
}
void logging_end(int addr)
{
if (!logging_disable) {
logging_buf[logging_cur++] = addr | (1<<31);
if (logging_cur >= LOGGING_BUF_SIZE)
logging_cur = 0;
}
}
> echo aaa
aaa
OK
> log
00043508 000430e4 800430e4 0004314c 8004314c 000430e4 800430e4 80043508
00043268 80043268 00043508 000430e4 800430e4 0004314c 8004314c 000430e4
800430e4 80043508 00043268 80043268 00043268 80043268 00043268 80043268
00043508 000430e4 800430e4 0004314c 8004314c 000430e4 800430e4 80043508
00043268 80043268 00043508 000430e4 800430e4 0004314c 8004314c 000430e4
800430e4 80043508 00043268 80043268 00043508 000430e4 800430e4 0004314c
8004314c 000430e4 800430e4 80043508 00043268 80043268 00043508 000430e4
800430e4 0004314c 8004314c 000430e4 800430e4 80043508 00043268 80043268
OK
>