4

Micrium uC-OS/IIのDynamicCで2つのタスクを実行しようとしています。1つのタスクはhttpハンドラーで、もう1つはシリアルポートから読み取ります。シリアルポートタスクは、httpタスクの実行を妨げているようです。これがなぜであるかについて何か考えはありますか?uC-OS/IIは先見の明があると思いました。

void httptask(void* ptr)
{
 http_init();

 while(1) {
  http_handler();
 }
}

void gpstask(void* ptr) {

 int c;

 while (1) {
        c = serFgetc();
    }
}

両方のスレッドが同じデフォルトの優先度に設定されています。

4

2 に答える 2

7

uC / OS-IIはプリエンプティブですが、一方向のみです。優先度の低いスレッドをプリエンプトして、優先度の高いスレッドを実行できるようにしますが、その逆は行いません。つまり、優先度の高いスレッドは、優先度の低いスレッドを実行できるようにするために、CPUの制御を明示的に放棄する必要があります。私はあなたのシリアルスレッドがHTTPスレッドよりも優先度が高く、それが( 、または他のルーチンserFgetc()を介して)制御をまったく放棄しないことを確信しています。OSMboxPendOSTimeDly

シリアルスレッドをシステム内で最も優先度の低いスレッドにするか、コードに何かを入れてCPUの制御を放棄できるようにしてください。(たとえば、使用可能な文字がないときにセマフォを待機します。このセマフォは、データ使用可能な割り込みから送信できます。)どちらも機能するはずです。

于 2010-07-10T18:19:10.890 に答える
2

uC / OS-IIは、固有の優先順位のみをサポートします。また、スケジューラーへの制御を放棄するために、OSTimeDLY(x)またはタスクループ内の他のアイテムのようなものが必要です。

于 2010-08-15T18:48:56.130 に答える