2
void print_task(void)
{
    for(;;)
    {
        taskLock();
        printf("this is task %d\n", taskIdSelf());
        taskUnlock();
        taskDelay(0);
    }
}
void print_test(void)
{
    taskSpawn("t1", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0);
    taskSpawn("t2", 100,0,0x10000, (FUNCPTR)print_task, 0,0,0,0,0,0,0,0,0,0);
}

上記のコードは次を示しています。

これはタスクです これはタスク 126738208 です 126672144 これはタスクです これはタスク 126712667214438208 です

これはタスクです これはタスクです 1266721441 26738208 これはタスクです 126672144 これはタスクです

マルチタスクで文字列を出力する正しい方法は何ですか?

4

3 に答える 3

1

問題は taskLock(); にあります。

代わりにセマフォまたはミューテックスを試してください。

于 2013-04-27T07:14:10.393 に答える
0

マルチスレッド環境で印刷する主なアイデアは、印刷専用のタスクを使用することです。通常、vxWorks には、システム内のすべてのタスクからログ メッセージを取得し、1 つのタスクのみからターミナルに出力するログ タスクがあります。vxWorks ロガー メカニズムの主な問題は、ロガー タスクが非常に高い優先度を使用し、システムのタイミングを変更する可能性があることです。

したがって、他のタスクからメッセージを取得する独自の優先度の低いタスクを作成する必要があります (メッセージ キュー、mutex によって保護された共有メモリを使用するなど)。その場合、2 つの大きなメリットがあります。1 つ目は、すべてのシステムの印刷出力が 1 つのタスクから印刷されることです。

2 番目の最も重要な利点は、システムのリアルタイム タスクが printf() 関数を使用して時間を無駄にしないことです。ご存知のように、printf はシステム コールを使用する非常に遅い関数であり、追加したデバッグ情報に従ってタスクのタイミングを確実に変更します。

taskLock、taskLock はカーネルへのコマンドとして使用され、現在実行中のタスクを CPU で READY のままにすることを意味します。

コード例で書いたように、 taskUnlock() 関数には引数がありません。基本的な理由は、カーネルと割り込みがシステムで taskUnlock を実行できるようにすることです。

タスクのロック解除を実行する多くのシステム コールがあります (また、サービス ルーティングを中断することもあります)。

于 2013-07-11T15:39:50.203 に答える