ちゃんと考えをテキストに起こすようにしよう。

と、いうのは、最近自分の考えをテキストに起こすということをやってなくて気付いたのだけど、自分の考えをブレないようにするためには、もしくは自分の考えが変わったときに、それを認識できるようにするにはテキストに起こしておくというのが重要だな、と、思ったのだった。

あと、「J」のほうはどこの会社の社員なのかバレるのに十分な情報をweb上に置いてしまったので、なんというか、色々と書きづらいのだというか。そういう。
ほとんど気にする人はいないと思うけど…余計な誤解を生む可能性が0でない以上、xxたん萌え〜、とかそういう余計なことを書き辛いなあという。いや、書かないが。

とは言っても、ここもバレてるも同じだが…まあ、ここまで読んでる人は過去ログまで十分さかのぼって読んでる人で、いらん誤解を招くことはないだろうから、気にしないでおく。頑張って余計なことを書くように努力したい。

あとなんとなくエロゲはやめたのでタイトルを修正しておく。

あと気が向いたらCSSを書きかえよう。

あと目標は週4ぐらい更新で。

デバッグ話を始めると「デバッガ?そんなもの使えない環境なのでprintfですが何か?」「printf?printfがあるだけ幸せだと思えよ」とか言う人がたくさん出てくる件について

もはや遅すぎるが流行には乗っておこう。printfすら無い環境でいかにデバッグするか、という話。printfが無い環境でのデバッグは僕の趣味みたいなものなので…
とは言っても、printfすら無い環境は特殊な環境であるのであまり汎用性は無い。

基本

基本的に、printfすら無い環境というのはコードがたかだか数千行くらいであることが多いので、まあ、なんとかなるのである。もしくはなんとかする。

「printfがあるだけ有り難く思えよ」という老害が出てきたときは、すかさず、「でもそれって実行バイナリ32KBの世界ですよね?今の時代、ランタイムだけで32KBぐらいあるんですが」とか言い返してあげるとよい。
老害の精神はズタボロになり、二度とエンジニアとして立ち直ることはできないだろうと思ったら、老害が「いや謎のボードにLinuxを移植して…」とか言ってあなたが完全敗北、精神はズタボロになり、エンジニアとして二度と立ち直ることができない状態に!!

デバッガがある

趣味の場合はともかく、まともな仕事としてやってる場合はJTAGデバッガぐらい買ってもらえるものである。
組み込み環境では、「printfは無いがデバッガはある」という状態は特に珍しくはない。
対処法としては多少無茶をしてもデバッガで解決させる、もしくはprintfをメモリ上に出して、デバッガでそれを見る、など。

ICEがある

最近は組み込み屋でも若い人はICEなんて実際に触ったことないんだろうなぁ…
JTAGエミュレータではないので、JTAGのことを「エミュレータ」と言う老害が出てきたときは、すかさず、「それってJTAGですよね?エミューレータじゃないんですが」とか言い返してあげるとよい。
老害の精神はズタボロになり、色々あって、あなたがエンジニアとして二度と立ち直ることができない状態に!!

デバッガがない

JTAGデバッガも安いものではないので、趣味でやるときは、デバッガもprintfも無い、というのは可能性としてある。
どういう状態かというと、何も出力が無い…と見せかけて、LEDが付いてたりするのでそれをピカピカさせてデバッグするのだ!世の中は全てバイナリ、1bitもあればなんとかなります!

とりあえずそれで頑張ってシリアルドライバかフレームバッファドライバを動かすところまで頑張る

LEDすら無い

大丈夫! 1bitもあればなんとかなるんだから!
手元にあるもの全てを使おう!リセットとか!

世の中のCPUは割り込み禁止状態で無効命令実行したり、アドレス境界エラーを放ったりすると、リセットがかかるものが多い。
これを利用して、リセットがかかる or かからない、とかそういう感じでデバッグうするのだ!大丈夫!1bitもあればなんとかなります!

リセットがかかったかどうかすらわからない

電源のON/OFF、リセットしたかどうか、すらわからないマシンというのは世の中にあって、いわゆる、0bitデバッグ、とか、スピリチュアルデバッグとか、そういうように呼ばれている類のアレである。
こういう場合は、マシンにやさしく呼びかけたり、休日は一緒に遊んだりするとよいと言われている。

printfすると正しく動作しやがる

上とはちょっと趣きが違うが…printfすると正しく動作するというのはよくある。
「こんなん無理」とか思ってしまいがちですが、忘れないで…こういう場合は、「printfすると正しく動作する」ということ自体がヒントになるのよ。

疑うべきは、

  • なんか初期値設定していない
  • タイミングの問題
  • 関数を呼ぶことで最適化が抑制されて動く

あたり
printfは結構スタックを綺麗にして、それなりに時間がかかるので、

  • スタックを綺麗にしない関数/綺麗にする関数
  • 時間かかる関数/かからない関数
  • asm()

などをprintfのかわりに入れて境界条件を見つけると問題が解決したりしなかったりする

printfするとなんか死ぬ

printfするとなんか死ぬケース。たまにある。
スタックオーバーフローしていないかをチェックすると問題が解決したりしなかったりする。
あとほっとくと気が付いたら動くようになってて、そのまま忘れてなんとかなったりする。(それはなんとかなったとは言わない)