4

PIC32MX スターター キットで PIC32 マイクロコントローラー用の FreeRTOS ポートを使用しています。タスクで遊んでいましたが、タスクはコンテキスト切り替えではありません。ここに私の主な構成設定があります:

#define configMAX_PRIORITIES    ( ( unsigned portBASE_TYPE ) 5 )
#define configKERNEL_INTERRUPT_PRIORITY         0x01
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    0x03
#define configTICK_RATE_HZ              ( ( portTickType ) 100 )

これで、2 つの LED を点滅させる 2 つのタスクが定義されました。両方の優先度は 4 (最高) です。通常の操作では、LED は 100 ティックごとに交互に点滅します。しかし、これは起こりません。2 番目の LED が 100 ティック点滅し、制御が一般的な例外ハンドラに移ります。なぜこれが起こるのですか?予定は全くないようです。

4

5 に答える 5

5

最初に確認することは、「ティック」割り込みです。多くの場合、割り込みが有効になっておらず、タイマーが正しく設定されておらず、PIC32 を設定する #pragma でクロックが適切に設定されていません。これらの問題はすべて、最初に「ティック」の欠如として現れます。

これが、タスクの切り替えを行わない最大の原因です。ティック割り込みが発生しない場合です。ここで、通常のプリエンプティブ タスク スイッチングが行われます。

「市販のデモ」を使用していると仮定すると、MPLAB でvoid vPortIncrementTick( void )関数にブレークポイントを設定し (FreeRTOS\Source\portable\MPLAB\PIC32MX\port.c の 177 行目あたり)、コードを実行します。そこにブレークポイントがある場合、タイマーティックは機能しています。

于 2011-03-15T14:20:35.093 に答える
4

ラウンド ロビン スケジューラはありますか。あなたのタスクは一定時間休んでいますか、それとも譲歩していますか (または忙しく待っていますか)?

組み込み OS でよくある問題は、スケジューラが同じ優先度の複数のプロセスを公平にスケジュールしようとしないことが多いことです。つまり、A が譲歩すると、A が実行可能であれば、B が何年にもわたって CPU を持っていなくても、A はすぐに再びスケジュールされる可能性があります。公平なスケジューリングを行うために多くの労力を費やすデスクトップ OS に慣れている場合、これは非常に直感に反します (少なくとも、私にはそうでした)。

これに遭遇した場合は、タスクが次のようになっていることを確認してください。

for (;;)
{
  led(on); sleep(delay);
  led(off); sleep(delay);
}

...点滅の間にタスクが実際に実行可能でなくなることを確認します。次のような場合は機能しません。

for (;;)
{
  led(on);
  led(off);
}

(また、一般的なルールとして、本当に必要になることがわかっている場合を除き、高い優先度ではなく通常の優先度を使用することをお勧めします。システム タスクが不足すると、システムが異常な動作をしたり、クラッシュしたりする可能性があります。)

于 2011-02-28T16:17:34.680 に答える
4

両方のタスクが適切に登録されていて、スケジューラが起動されていますか?

次のコードのようなものが仕事をします:

xTaskCreate( yourFirstTask, "firstTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL );
xTaskCreate( yourSecondTask, "secondTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL );
vTaskStartScheduler();

アプリケーション ティック フックを追加して、ティック中断が正しく発生するかどうか、またはティック タイマーに問題があるかどうかを確認することもできます。

于 2011-02-28T16:41:14.690 に答える
3

FreeRTOS/Demo/Common/Minimal/flash.c ソース ファイルには、LED を点滅させるだけの標準的なデモ タスクがあります。そのファイルで作成されたタスクは、標準の PIC32 デモ アプリケーション (Microchip Explorer16 ボードをターゲット) に含まれています。

非常に単純な形式では、500 ミリ秒ごとにトグルして LED を点灯させるだけのタスクは次のようになります。

/* Standard task prototype, the parameter is not used in this case. */    
void vADummyTask( void *pvParameters )
{
const portTickType xDelayTime = 500 / portTICK_RATE_MS;

    for( ;; )
    {
        ToggleLED();
        vTaskDelay( xDelayTime );
    }        
}
于 2011-03-02T18:56:58.463 に答える