1日でのタスクスイッチロギング

私のキャリアの夜明けには、RTOS VxWorksとTornado開発環境で作業する機会がありました。 印象は非常に好意的でした(特に今では比較すべきものがあります)が、投稿はそれについてではありません。 システムの不可欠な部分は、タスクの切り替えに関する情報をリアルタイムで収集して視覚化するシステムでした。 私はすぐにそれが非常に有用であると言わなければなりません、彼らがそれを一度見た方が良いと言うことのために何もしないためではありません。 たとえば、システムに少なくとも20個のタスクがある場合、99%の自信を持って、タスクの切り替えの視覚化を見ると非常に驚かされると言えます。これは想像したものとはまったく異なります。



たとえば、予期しないクラッシュ、フリーズ、またはリブートが発生した場合、システムの寿命の最後の瞬間を見ることができるという事実の利点は、言うまでもありません!



しかし、RTOSとそのような便利なメカニズムがない環境で作業する必要がある場合はどうすればよいでしょうか? もちろん、自分でやってください!







パート1、統計収集。



ここではすべてが簡単です-正確なタイマー(マイクロ秒またはさらに正確に)とメモリの空き領域が必要になります。 メモリでは、データ用の配列にスペースを割り当て(「1つのスイッチ-taskId +時間」に基づいて)、OCイベント「task switching」で「ハングアップ」します(また、それらを追跡したい場合は、割り込みへの/からの入出力)。データ(アクティブ化されたタスクのIDとタイマー値)を配列(循環バッファーとして使用)に保存します。



「ユーザー定義イベント」を実装することもできます-呼び出されたときにこの配列に値を保存して、コード内のイベントが正確に発生するタイミングを確認する関数を作成します。



オンデマンドロギング(CLI、関数呼び出し...)を開始および停止する機能と、継続的なロギングの可能性(たとえば、障害の直前の瞬間を追跡するために-結局、再起動後、保存されたデータはメモリに強制的にクリアされない限り、メモリに完全に保存されます)



そして、組み込みシステムに応じて、この配列を組み込みデバイスからPCに転送し、そこで視覚化する方法を実装します。 組み込みシステムにファイルシステムがある場合は、ファイルに書き込むことができますが、ファイルがない場合は、たとえば、ネットワーク経由で送信する他のオプションがあります。 デバッグにはシステムで使用されているRS232を使用しました。



収集された情報を視覚化するために残ります。 そして、ここでは何も書く必要さえありません(まあ、ほとんど何もありません)。 無料のOctaveパッケージを使用できます。これは、関数の2Dグラフィックスを描画し、ズームイン-ズームアウトを実装します(ほんの数秒でデータを収集する場合でも、通常、タスクの時間の量は1ミリ秒で、ズームなしでで取得しないでください)。



必要なことは、収集したデータをオクターブ形式に変換することだけです。



y = [time1、time2、...、timeN];

x = [task1、task2、...、taskN];

プロット(x、y)

グリッドオン



ここで、timeXは時間(任意の単位で、たとえばマイクロまたはミリ秒を使用し、time1を0にする方が便利です)、taskXはタスクID(原則として、任意の数ですが、タスクを並べ替える方が便利です) IDが1、2、3 ...になるように優先順位を付けて正規化し、どの値にどのタスクがあるのか​​を覚えておいてください)。 割り込みやユーザーイベントがある場合は、たとえば、ユーザーイベントに負の番号を付けるなど、何かを考えることもできます。



この変換の方法-誰もが自分で選択できます(ここで、独自のコードを少し書く必要があります)。



結果は次のようになります。 これは、システムがアイドル状態でどのように見えるかです:







そして、ここにあります-完全にロードされた:







システムで実際に何が起こっているのかを見る機会は、少し時間をかけて上記のアクションを実行するだけの価値があるように思えます。



もちろん、WindRiverのプロが作成したソリューションはよりきれいで、抽象IDではなくタスク名を表示し、グラフ上のポイントに興味深いポイントが表示されていました...しかし、存在しない場合は、シンプルではあるが独自のものを用意する方が良いでしょう。



All Articles