0

私は GCC で stm32f103 を使用しており、次の擬似コードで説明できるタスクがあります。

void http_server() {
  transmit(data, len);
  event = waitfor(data_sent_event | disconnect_event | send_timeout_event);
}

void tcp_interrupt() {
  if (int_reg & DATA_SENT) {
    emit(data_send_event);
  }
}

void main.c() {
  run_task(http_server);
}

すべての組み込み OS がそのような機能を提供することは知っていますが、この単一のタスクには大きすぎます。プリエンプション、ミューテックス、キュー、その他の機能は必要ありません。二次タスクでフラグを待って、割り込みでこれらのフラグを上げるだけです。誰かがこのトピックに関する優れたチュートリアルを知っているか、コンテキスト切り替えと待機実装のコードを持っていることを願っています。

4

2 に答える 2

1

おそらく、割り込み駆動の有限状態マシンを使用する必要があります 。

于 2010-08-25T12:36:55.540 に答える
0

オペレーティング システムや割り込みに依存しない IP スタックが多数あります。lwip(軽量IP)が思い浮かびます。ザイリンクスから提供されたので、間接的に使用しました。freedos の人々は 1 つ持っている可能性があります。確かに、crynwr パケット ドライバーが思い浮かび、スタックが構築されたことは間違いありません。

おそらくもっと単純な質問まで。あなたのコードは、いくつかのグローバル変数が変更されるのを待っている無限ループになりたいように見える waitfor() 関数のフォアグラウンド タスクに座っています。そして、割り込みが発生すると、割り込みハンドラーが呼び出され、多くのスタック作業 (tcp 割り込みであることを知るため) が呼び出され、フラグが変更され、割り込みが終了し、waitfor がグローバル フラグの変更を確認します。コンテキストスイッチは、プロセッサに組み込まれた割り込みであり、オペレーティングシステムやその他の凝ったものは必要なく、1 つまたは 2 つのグローバル変数と isr は必要ありません。コンテキスト スイッチとフラグ/イベントは、tcp/ip スタックと比較して景品です。udp の方がはるかに簡単ですが、本当に tcp が必要ですか?

これらの waitfor() を複数アクティブにしたい場合は、基本的に、1 つの forground タスクだけを 1 つの waitfor() に配置する必要はありません。それから私は2つのことのうちの1つをします。waitfor(something) の代わりに、フォアグラウンド タスクのポーリングを if(checkfor(something)) { then do something } に変更します。

または、疑似コードではこれが tcp パケット データであることを知るにはすでに非常に複雑な割り込みハンドラーが、tcp ヘッダーをより深く調べて、ポート 80 のイベントに対して http_server() を呼び出し、他の関数を呼び出すことを認識するように、システムをセットアップします。あなたが待っていたかもしれない他のイベント。したがって、この場合、waitfor() を実行するマルチタスクの一連の関数の代わりに、イベントの 1 つのリストを作成し、ISR でそれらを探します。タイムアウトにはタイマーと割り込みとグローバルを使用します (パケットが到着したときにカウンターをリセットし、カウンターが N に達してタイムアウトが発生した場合はタイマー割り込みでカウンターをバンプし、タイムアウト タスク ハンドラー関数を呼び出します)。

于 2010-08-25T17:49:44.560 に答える