Какую задачу предполагается создать в этом примере? - PullRequest
0 голосов
/ 07 января 2011

Для обычного двоичного семафора задача пытается синхронизироваться с внешнее событие создает пустое семафор .... Второе задание, которое контролирует событие синхронизации дает семафор, когда его нет больше нужно.

#include "vxWorks.h"
#include "semLib.h"

#define T_PRIORITY 50


SEM_ID syncExampleSem;    // named semaphore object

void initialize (void)
{

    // set up FIFO queue with emtpy binary semaphore

syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);

    // create task1
    taskSpawn ("task1", T_PRIORITY, 0, 10000, task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    // create task2
    taskSpawn ("task2", T_PRIORITY, 0, 10000, task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

}

void task1 (void)
{
    // stay here until semaphore becomes available
    semTake (syncExampleSem, WAIT_FOREVER);


    // do something

}



void task2 (void)
{
    // do something



    // now let task1 execute
    semGive (synExampleSem);

} 

Мой вопрос: почему я не вижу первую задачу по созданию пустого семафора, как описано? (Похоже, что это делается «в общем» в основной функции?) «задача, пытающаяся синхронизироваться с внешним событием, создает пустой семафор». Кроме того, я не вижу, как вторая задача «контролирует» синхронизацию?

Спасибо.

См .: Пример синхронизации через двоичный семафор
http://www.cross -comp.com / инстр / страницы / встроенный / VxWorksTutorial.aspx # VxWorks% 20Programming

Ответы [ 2 ]

3 голосов
/ 07 января 2011

В примере есть ошибка.Первую строку в initialize следует присвоить syncExampleSem.

Второе задание «контролирует» синхронизацию, поскольку задание 1 не может быть продолжено, пока задание 2 не «выдаст» семафор.На самом деле не имеет значения, где создается семафор, если он гарантированно будет создан до того, как задача попытается либо дать, либо взять.

Поскольку эти конкретные задачи выполняются параллельно, он создается в initialize, потому что, если он был создан задачей 2, вы рискуете, если задача 1 подождет семафор, прежде чем он существует, и наоборот, если онсоздается задачей 1, вы рискуете, если задача 2 передаст семафор до его существования.

1 голос
/ 01 апреля 2011

SemTake и SemGive возвращают ошибки (поскольку семафор не существует).Ценно проверить коды возврата при системных вызовах.

...