スタッフのブログです。個以上あるコメントは受け付けない設定になってます。デバッガを触った時は感動しました。(と言っても、わずか半年ほど前なのですが。剥き出しの基板を渡されても、「これで一体何をどうすれば良いのだろうか...」と戸惑ってしまいました。上でプログラムを書いていた時、いかに自分が分厚く抽象化された世界の上で生きていたのかということを実感させられます。ドライバが無いのでそんなに簡単には動かせません。はてさてどうしたものか。つないでデバッガを起動してくれました。クロスコンパイラが生成した実行ファイルをそのままロードできるのですが、これだけでも驚きました。そのままステップ実行できる。全てのメモリが見える。レジスタの値も何もかも自由に変えられる。次に感動したのは、シリアルコンソールがつながった時でした。シリアルコンソールなんて使ったのは初めてでした。最終的にはこういう風なところに落ちるんだなぁと、もちろんそれまで知識は多少あったわけですが、やはり実際に経験してみたことにより、ふっと腑に落ちてつながる感覚がありました。作り出した仮想のコンソールの上に文字が出るわけです。いう抽象化層を全て取っ払った世界にいきなり入ることが出来る。デバッガの感動は、実際に味わってみるのが一番ではないかと思います。組み込み業界の社会人だけではなく、むしろ学生さんにこそデバッガ使って欲しいなと思ったりもします。身近に感じられ、教育用にも最高なのではないかと思います。シミュレータ作成においても大変魅力的だと私は個人的に思っています。シミュレータだけ作っても、基本的には何もできません。いう、ある意味では非本質的な部分に非常に多くの労力が割かれています。(デバッガにレジスタやメモリの値を渡す通信のしくみ。デバッガソフトウェアの汎用的なしくみをそのまままるごと利用することができます。シミュレータのメモリにロードして実行することができます。マクロ機能を使えば、様々なテストが自動化可能です。つながって、実機と同様に動いてデバッグできるというのは、ものすごく楽しくてうれしいものです。動いた時が、第三の感動でした。イベントトラッカーという機能が標準で搭載されています。http://www.kmckk.co.jp/event_tracker/index.htmlイベントというと何やら難しそうですが、ここでいうイベントとは「ターゲットプログラムの実行中に、なんらかの変化が起こった」ということを指します。特定のアドレスに来た場合など、任意の状態変化をイベントとしてユーザ定義することができます。イベントトラッカーは、メモリに記録したログデータをグラフィカルに表示・解析するための汎用的なしくみを提供します。デバッグができるのは、けっこう恵まれた状況です。使えない状況がけっこうあります。デバッガを使えば、そのような状況でも、とりあえずステップ実行をしてプログラムの動きを追うことができます。割り込み処理など、タイミングが重要なプログラムをデバッグする際には、これだけでは厳しいです。呼ぶとタイミングが狂って再現しなくなってしまうバグなどもありがちです。このような場合、イベントトラッカーが威力を発揮します。つながって、メモリの読み書きができて、ログ用のバッファが確保できる状況ならば使えます。しくみが単純で処理が軽いぶん、様々な場面に使える、非常に一般的なデバッグ手法と言えます。提供するパッチを当てることにより、プロセスの切り替えなどのタイミングを詳細に記録することができます。提供するヘッダとソースコードをプロジェクトに組み込み、初期化関数を読んだ後、任意のタイミングでイベント発行関数(引数に与えられた整数がイベントとして記録されます)を呼ぶことで、イベントログを取ることができます。ファイルのみなので、カスタマイズも簡単にできます。イベントトラッカーがやっていること自体は特別なことではなく、多かれ少なかれ、どこの組み込み開発でもアドホックに行われていることだと思います。占有時間の計算やイベントの抽出・マスク機能など、高度な表示や統計・解析機能が簡便に使えるようになり、工数が削減できます。しくみが共通化されることにより、デバッグの属人性が薄まり、ノウハウの共通化が可能になるため、開発そのものだけではなく、技術教育面などにも恩恵があると考えられます。スナップショットデバッガ皆さん、こんにちは。ver5.6に搭載した新しい機能「スナップショットデバッガ」についてお話します。ver5.6は、つい先日に僕たちがリリースした、新バージョンデバッガです。この新バージョンデバッガには、新たに「スナップショットデバッガ」という機能を追加しました。このスナップショットデバッガを一口で説明すると、「コアダンプのCPU版」という感じでしょうか。UNIX上でのcoreファイルを使ったデバッグに似ています。PARTNER-Jetを使ってターゲットボードのソフトウェアをデバッグしている時に、デバッガ上からスナップショットを作成します。その後は、作成したスナップショットファイルを用いて、ターゲットボードなしにオフラインでデバッグを行う、という機能です。オフラインでのデバッグになるので、CPUの実行に関する事はできませんが、その他のデバッガの機能はほぼ全て利用可能です。スナップショットファイルには、それを作成した時点でのメモリの内容とCPUの汎用レジスタや制御レジスタの情報などのほかに、PARTNER-Jetで採取していたETMやAUDなどの実行トレースの内容も保存しています。トレースデータを参照すれば、そこに至る過程も調べる事もできます。私的な話になりますが、僕はその昔に通信機器のOSの開発をしていた事があります。電話網に使われる通信機器ですので、耐障害性など品質については厳しく”全てのバグを取り除く”という意識でのソフトウェア開発でした。難解なバグや再現性の低いバグも多く、そのようなバグ調査に実機を長時間占有させておくことも難しい事も事実でした。そのような状況でも、障害発生時に保存した実機のメモリを、ワークステーション上で解析をしてバグ対策を行っていました。同じ問題を一人ではなく複数人で解析したり、ファイルを転送して離れた場所の人と一緒に解析したりしていました。当時は物理メモリのファイルと、そしてシンボルデータをつき合わせて、構造体などをメモ書きしながら解析をしていました。このスナップショットデバッガを利用すれば、より快適にこのような作業を行うことができます(当時は本当に根性デバッグで大変でした)。(数学関数)前回に続いてもう少しgccのビルドイン関数を見ていきます。gccはとてもたくさんのビルトイン関数があります。オンラインマニュアルのこのページにリストがあります。http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Other-Builtins.html#Other-Builtins標準の数学関数はほとんどがビルトイン関数になっています。引数が定数の場合にはコンパイル時に計算されてしまいます。具体例を見てみましょう。仕事の内容などデバッガを作ってる会社と言われても、なかなか外からは何をやってるか想像できないのではないかと思います。この記事では、あまり組み込み業界に馴染みが無い方向けに、少し会社の仕事内容を説明してみたいと思います。デバッガと呼ばれる組み込みソフトウェア開発向けのデバッガです。デバッグのために作られた回路内のエミュレータ、つまりハードウェアのことを指していたのですが、現在ではその範囲が拡大され、デバッグのためのソフトウェア/ハードウェアをかなり広範囲に含む用語となっています(私の解釈。人それぞれ用語の使い方がけっこう違ったりします)。上で動くデバッガソフトウェアで構成されます。技術など、非常に高度で専門的なプログラミング技術がいくつも必要とされます。上で動くデバッガも社内用に開発し、開発メンバーは毎日使ってます。非常に良い循環ができていると言えます。)もちろんデバッガの新機能を開発したり、サポートや保守を行う人が多いのですが、そればかりではありません。ソフトウェアを製品にして、営業・販売するまでには、たくさんの人たちの様々な仕事が必要です。デバッガは非常に多機能なので、機能をわかりやすく説明するマニュアル類などの整備が必要です。(海外用の英訳なども含む)。デバッガは、ドライバ類からデバッガソフトウェアまで多数のコンポーネントで構成されているので、インストールのしやすさも重要です。デバッガの機能をお客様に説明し、使っていただくためには、営業スタッフの方々のデモが必要です。仕事の性質上、営業スタッフには、ある程度の技術力や開発経験が求められます。そのためほとんどの方が元技術者か、あるいは今でも現役の技術者です。自社製ボードも開発しています。ボードの設計や製造管理、検査を行うことも、デバッガベンダーには欠かせない重要なお仕事です。デバッガの能力を高め、連携するための各種製品開発も重要です。デバッガ用プラグインなどを開発している人たちもいます。数人という少人数で対応しています。多様な技術を、大企業のような分業制では無く、一つのオフィスの中で全て掌握し、頻繁なコミュニケーションを取っていることにより、仕事や発想の幅が広がると思います。良さであり、強さの源なのではないかと個人的には思っています。シミュレータという、少し他の人たちとは毛色が異なる研究開発を今のところメインでやっているのですが、少し長くなりましたので、またの機会に話そうかなと思います。(printf)gccのtipsを紹介します。変わっているところです。world!\n");}このプログラムはgcc3では普通にprintfを呼び出すコードを生成しますが、gcc4ではどうなるでしょうか。ARM版のexeGCC4でちょっと試してみます。周年の節目だそうです。昔の話をしたいと思います。代なので、まだ生まれてません。