ダイナミックC / RabbitのMicrium UC-OS / II - タスクの飢餓がある可能性があります
-
13-09-2020 - |
質問
Micriam UC-OS / IIの下で私のダイナミックCで実行するための2つのタスクを取得しようとしています。1つのタスクがHTTPハンドラで、他のシリアルポートからの読み込みがあります。シリアルポートタスクは、HTTPタスクが実行されないように見えます。なぜこれがなぜどんなアイデアですか?私はUC-OS / IIがプリ科目だと思った。
void httptask(void* ptr)
{
http_init();
while(1) {
http_handler();
}
}
void gpstask(void* ptr) {
int c;
while (1) {
c = serFgetc();
}
}
.
両方のスレッドは同じデフォルトプライオリティに設定されています。
解決
uc / os-iiはプリエンプティブですが、一方向にのみ - 優先順位の低いスレッドをプリエントションして、優先順位の高いスレッドを実行できますが、逆もできません。つまり、優先順位の低いスレッドを実行できるようにするために、優先順位の高いスレッドがCPUの制御を明示的に放棄する必要があります。私はあなたのシリアルスレッドがHTTPスレッドよりも優先順位が高いこと、そしてserFgetc()
はすべて(OSMboxPend
、またはOSTimeDly
または他の何らかのルーチンを通して)コントロールをあきらめません。
シリアルスレッドをシステム内の最小の優先順位のスレッドを作るか、またはそのコードに何かを付けて、CPUの制御を行うことができます。(たとえば、文字が利用できない場合はセマフォを待っています。このセマフォは、データ使用可能な割り込みから投稿できます。)も動作する必要があります。
他のヒント
UC / OS-IIは独自の優先順位のみをサポートします。また、タスクループ内の他の項目のようなものや他の項目がスケジューラに制御する必要があります。
所属していません StackOverflow