幽霊の捕まえ方

LynxEyedさんが、mbedの不可解な挙動に遭遇している模様。
で、ドライヤーであぶってみろとアドバイスしたのですが:

思い当たる節というか、元半導体屋の職業的なサガみたいなものです。問題の発生が決定論的ではない場合、ソフトウェアが悪いのかハードウェアが悪いのか、自信がなくなるものです。というか、半導体の製造業者が疑われるのです。不良品ではないかと。そう言う場合、定番の検査方法が「ドライヤーで加熱する」というものです。
半導体はそもそも熱に対して非常に敏感です。

  • 加熱するとMOS FETはスイッチング速度が低下するのでマージンが少ない場合には論理回路がクロックに付いていかず、不具合が発生する傾向が強まる。
  • 初期状態が不定なメモリやレジスタは初期状態が熱によって変化する。

そのため、加熱するというのは問題がハードウェアに関連するかどうか調べるための常套手段です。問題が熱に対する依存性を持たず、かつチップ個体間で挙動が変わらなければ、「お客さんのソフトの問題と考えられます。プッ」と、半導体メーカーは返答します。一方、熱に対する依存性があって、かつ個体間で挙動が変わると、ガタガタ震えながら「ロット依存性はいかがですか?」と聞くことになります。
問題に熱依存性があり、かつ個体間に挙動の違いがあってもハードウェアの問題とは言い切れません。しかし、ソフトウェアの問題だとすると、

  • 初期化されていない変数がある
  • 初期化されていないレジスタがある

のではないかと推測されるわけです。C言語の場合は未初期化変数がゼロフィルされるため、ランタイムにバグが無い限り未初期化変数云々は決定論的にふるまいます。一方、ペリフェラルレジスタの初期化はアプリケーションやミドルウェアの責任ですので、熱に依存する問題の場合、ソフトウェアではこう言ったところを疑います。
変数ではなく、プログラムの位置に依存するように見えるなら、そこが回路のクリティカルパスになっているのではないかとハードウェアを疑います。ハードウェアの問題の場合、設計ミスでなければロット依存性が現れることが多いです。
常に同じ傾向で不具合が現れるわけではありませんが、だいたいこんな感じです。