1

200mhz MIPS CPU でembedde linux を実行しているデバイスに次の機能を実装する必要があります: 1) リセット ボタンが押されたままの時間が 1 秒未満の場合 - 再起動に進みます 2) リセット ボタンが押されたままになっている場合3秒以上 - NVRAM からデフォルト値でシステムの構成を復元し、再起動します。

私は 2 つの方法を考えています: 1) GPIO ioctl を介して適切なタイミングでボタンの状態を常にポーリングするデーモン (オーバーヘッドが大きすぎる可能性があり、多くのコンテキスト切り替えが必要ですか?) 2) ボタンをポーリングし、タイミングを測定し、たとえば、 /proc を介して、デーモンまたはシェルスクリプトがチェックして必要なことを実行できるユーザー空間に状態を送信します。

どちらの場合も、時間を測定する方法がわかりません:(何を提案/推奨しますか?

4

3 に答える 3

2

それらをハードウェアに実装する必要があります。「NVRAM からデフォルトを復元」の目的は、いわゆる「ブリック」デバイスを復元することです。

たとえば、デバイスが起動できないように NVRAM 設定が変更された場合 (cosmic ray?) はどうなるでしょうか? その場合、提案されたボタン ポーリング デーモンは決して実行されません。

再起動を 1 秒間保持するには、RC (抵抗器 + コンデンサ) 回路を使用して、ボタンの押下を「デバウンス」します。1 秒の遅延に適した RC 時定数を選択します。RC 電圧を監視するコンパレータを使用しRESETて、MIPS CPU のピンに信号を送ります。

3 秒間押す機能 (NVRAM のデフォルトを復元する) については、おそらくもっと複雑なことをしなければなりません。

1 つの可能性は、小さな PIC マイクロコントローラーをリセット回路に入れることですが、NVRAM ではなく、ヒューズ (消去不可) ROM を備えたマイクロコントローラーのみを使用します。

より簡単な方法は、NVRAM と同じ回路およびバス上にデフォルトを含む ROM を用意することです。AJ/K フリップフロップ ラッチは、リセット回路の一部になる可能性があります。また、3 秒に調整された RC 回路とコンパレータも必要です。3 秒未満のプレスでは、フリップフロップは0出力をラッチする必要があり、3 秒以上のプレスでは、2 番目の RC 回路が 3 秒後にコンパレータをトリガー1し、J/K ラッチに a を提示する必要があります。出力。

フリップフロップ出力Qは、このリセット サイクルが 3 秒間のプッシュに続いたかどうかを回路に伝える単一ビットを格納します。その場合、その出力Qはチップ セレクトを NVRAM にQ*駆動し、チップ セレクトを ROM に駆動します。(チップセレクトは、NVRAM チップと ROM チップの両方で負論理であると想定しています。)

その後、CPU が起動すると、チップ セレクト ラインに応じて、NVRAM または ROM から設定が取得されます。

ブート コードは、ROM チップ セレクトで起動したことを検出でき、後で GPIO ラインで J/K フリップフロップをリセットできます。その後、CPU は適切な値を NVRAM に書き戻すことができます。うまくいけば、デバイスのブリックが解除されます。

消去も再利用もできないROMを使いたい。そのような ROM は、静電気、電源障害、および放射線に最も耐性があります。放射線は私たちが一般に認識しているよりもはるかに多く存在しており、宇宙線フラックスの量は、たとえば航空機に搭載されたデバイスによって増加します。

于 2010-08-11T03:31:02.507 に答える
1

私は MIPS プロセッサと、使用できるピンの GPIO/割り込み機能に精通していませんが、可能な方法論は次のようになります。

  1. 入力ピンを割り込み入力として構成します。
  2. 割り込みが発生したら、割り込みを無効にして、短い 100ms っぽいタイマーを開始します。
  3. タイマーがトリガーされたら、ボタンがまだ押されていることを確認します (デバウンス用)。そうでない場合は、GPIO 割り込みを再度有効にして再起動します。そうでない場合は、3 秒のタイムアウト後にタイマーを再トリガーするように設定します。
  4. 今回タイマーがトリガーされたときにボタンが押されていない場合は、再起動します。それ以外の場合は、システム構成をリセットして再起動します。

ピンが割り込みを提供できない場合、ステップ 1 は入力を調べるためのポーリング タスクになります。

リセット ボタンが押されてから完全なリセット プロセスが実行されるまでの時間は、デバウンス ボタンを押してから常に 3 秒です。リセットの状況では、特にステップ 3 の一部として、リセット シーケンスが開始されたことをユーザーに明らかにする場合 (たとえば、ディスプレイを空白にする場合)、これは重要ではない可能性があります。

于 2010-08-11T08:17:18.597 に答える
0

これをソフトウェアで行う場合は、シェル スクリプトやデーモンではなく、カーネル (割り込み) コードに配置する必要があります。より良いアプローチは、これをハードウェアに組み込むことです。

私の経験では、デバイスをリセットする理由として考えられるのは、プロセッサをロックまたはブリックした不正なユーザー コードです。問題が RF エネルギーまたはその性質によるメモリの破損である場合は、デバイスを再フラッシュして問題を修正するために、ハードウェアまたは外部 (強化) プロセッサが必要になる場合があります。

不正なユーザー コードの場合、プロセッサの割り込みとカーネル コードは引き続き実行されますが、ユーザー コードは完全に停止する可能性があります。割り込みからピンをポーリングできる場合は、期待するリセットを実際に取得する可能性がはるかに高くなります。また、これにより、常にピンをポーリングするのではなく、イベント ドリブン プログラミングを行うことができます。

もう1つのアプローチ(リストした仕様ではありませんが、同じ目標を達成するための一般的な方法)は、スタートアップルーチンでGPIOラインをチェックし、デバイスを再初期化するときにボタンを押したままにすることです. 私が見たほとんどの組み込み Linux デバイスでは、「リセット」ボタンは、GPIO ピンではなく、マイクロコントローラーの専用リセット ピンに接続されています。トレースの切断を開始したい場合を除き、このルートを使用する必要がある場合があります。

于 2010-08-17T21:18:30.783 に答える