0

私は RTOS プログラミングにかなり慣れていないので、Mutex を使用する際の優先順位に問題があります。

以下の優先順位を設定しています。

#define T_HI_PRIORITY 10
#define T_ME_PRIORITY 50

そして、このコードでタスク「tMePriorityTask」を最高の優先度で実行し、「tHiPriorityTask」を中の優先度で実行したいと考えています。「tLoPriorityTask」はコメント化されているため、現在は実行しないでください。

#include <stdio.h>
#include "main.h"
#include "vxWorks.h"
#include "semLib.h"
#include "taskLib.h"

SEM_ID semMutex;    // named semaphore object

char alphabet[27];  // memory resource to have exclusive access

void tHiPriorityTask (void)
{
   int i;

    // enter critical region - any other tasks wanting access to alphabet[] should
    // wait for available semaphore
    semTake (semMutex, WAIT_FOREVER);

   // write alphabet to global array
    for (i= 0; i < 26; i++)
        alphabet[i] = 'A' + i;

    alphabet[i] = '\0';

    printf("High priority.\n-Counting alphabet...\n");

    // leave critical region
    semGive (semMutex);
}

void tMePriorityTask (void)
{
    // enter critical region
    semTake (semMutex, WAIT_FOREVER);

    //medium priority task enters
    printf("Medium priority.\n-Just entering...\n");

    // leave critical region
    semGive (semMutex);
}

/*void tLoPriorityTask (void)
{
    // enter critical region
    semTake (semMutex, WAIT_FOREVER);

    // array members guaranteed stable while being read by this task
    printf("Low priority\n");
    printf ("-alphabet= %s ", alphabet);

    // leave critical region
    semGive (semMutex);
}*/

void main (void)
{
    //create binary semaphore which is initially full (available)
    semMutex = semBCreate (SEM_Q_PRIORITY, SEM_FULL);

    // spawn high priority task
    taskSpawn ("hi_priority_task", T_ME_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tHiPriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    // spawn medium priority task
    taskSpawn ("me_priority_task", T_HI_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tMePriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    // spawn low priority task
    //taskSpawn ("lo_priority_task", T_LO_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tLoPriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

タスクを生成するときに優先度を変更しようとしましたが、うまくいかないようです。少なくとも画面上では何も変わりません。VxWorks RTOS を使用しています。

ありがとうございました。

4

2 に答える 2

0

2 つのスレッドが特定の順序で実行されることを保証したい場合は、スレッドの適切な同期を使用する必要があります。優先度を設定してそれが機能することを期待するだけでは、設計が非常に貧弱です。機能する可能性がありますが、最終的には壊れます (たとえば、ブロッキング呼び出しを行うと、他のスレッドの実行を妨げるものは何もありません)。

コードを変更して、スレッドでの優先度やその他の操作に関係なく、tHiPriorityTask の実行が許可される前に tMePriorityTask スレッドが最後まで実行されることを保証する最も簡単な方法を次に示します。

#include <stdio.h>
#include "main.h"
#include "vxWorks.h"
#include "semLib.h"
#include "taskLib.h"

SEM_ID semMutex;    // named semaphore object

char alphabet[27];  // memory resource to have exclusive access

void tHiPriorityTask (void)
{
   int i;

    // enter critical region - any other tasks wanting access to alphabet[] should
    // wait for available semaphore
    semTake (semMutex, WAIT_FOREVER);

   // write alphabet to global array
    for (i= 0; i < 26; i++)
        alphabet[i] = 'A' + i;

    alphabet[i] = '\0';

    printf("High priority.\n-Counting alphabet...\n");

    // leave critical region
    semGive (semMutex);
}

void tMePriorityTask (void)
{
    // enter critical region
    //semTake (semMutex, WAIT_FOREVER);

    //medium priority task enters
    printf("Medium priority.\n-Just entering...\n");

    // leave critical region
    semGive (semMutex);
}

/*void tLoPriorityTask (void)
{
    // enter critical region
    semTake (semMutex, WAIT_FOREVER);

    // array members guaranteed stable while being read by this task
    printf("Low priority\n");
    printf ("-alphabet= %s ", alphabet);

    // leave critical region
    semGive (semMutex);
}*/

void main (void)
{
    //create binary semaphore which is initially full (available)
    semMutex = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY);

    // spawn high priority task
    taskSpawn ("hi_priority_task", T_ME_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tHiPriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    // spawn medium priority task
    taskSpawn ("me_priority_task", T_HI_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tMePriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    // spawn low priority task
    //taskSpawn ("lo_priority_task", T_LO_PRIORITY, VX_FP_TASK, 10000, (FUNCPTR) tLoPriorityTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}

私がしたことは、SEM_EMPTY でセマフォを作成し、tMePriorityTask から semTake を削除することだけでした。

このように、tHiPriorityTask は任意の優先度で実行でき、tMePriorityTask が semGive を発行するまで semTake でブロックされます。さらに、tMePriorityTask スレッドは他のブロッキング呼び出し (I/O 呼び出しなど) を実行でき、tHiPriorityTask スレッドは semGive まで実行できません。

semBCreate の vxworks API リファレンスをチェックアウトし、SYNCHRONIZATION というタイトルのセクションを読んでください。

于 2013-08-28T19:50:11.213 に答える