Перейти к содержанию
    

Я делал так:
создал класс-задание:

struct Task
{
    char query[20];
    char response[20];
    int errorCode;
    OS:TeventFlag flag;
}

 

У процесса, который отвечает за обмен (CommunicationProcess), есть очередь заданий (указателей на задания):
OS::channel<Task*, 4> tasks;

Когда какой-то другой процесс желает совершить обмен, он делает следующее:

int Process2::doSomething()
{
    Task t;
    strcpy(t.query, "GET VAR1");
    communicationProcess.execCommand(&t);
    return t.errorCode;
}

 

CommunicationProcess::execCommand выглядит так:

void CommunicationProcess::execCommand(Task* t)
{
    tasks.push(t);
    t->flag.wait();
}

 

Ну и сам главный цикл коммуникационного процесса:

OS_PROCESS void CommunicationProcess::exec()
{
    for(;;)
    {
        Task* t;
        if (tasks.pop(t, 10))  // достаём задание
        {
           // выполняем его (схематично)
           uart.send(t->query);
           if (uart.receive(t->response))
              t->errorCode = 0;
           else
              t->errorCode = 24;
           t->flag.signal();    // сигнализируем, что задание выполнено
        }
        else
        {
           // заданий нет, делаем фоновую работу
        }
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переделываю для работы с scmRTOS библиотеку, рассчитанную на uC/OS-II. Понадобился счетный семафор.

Поглядывая на recursive mutex пробую сейчас написать свой, но может быть кто-то это уже делал и я изобретаю велосипед?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если нужен счётный семафор, то лучше сразу сделать свой - там для этого есть штатный путь: отнаследоваться от TService и написать свою логику, подсматривая, как сделаны другие сервисы межпроцессного взаимодействия. Имхо, это будет прямой путь: проще и без костылей. За основу возможно подойдёт тот же TMutex, только вместо простого флага там счётчик завести.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, dxp сказал:

За основу возможно подойдёт тот же TMutex, только вместо простого флага там счётчик завести.

Может я чего-нибудь не понял, но вы описали TRecursiveMutex.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Сергей Борщ said:

Может я чего-нибудь не понял, но вы описали TRecursiveMutex.

У TRecursiveMutex логика работы противоположная. Его можно залочить несколько раз, а мне нужен "Mutex" который можно несколько раз разлочить. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я правильно понимаю, что нет способа получить любой идентификатор текущего выполняемого процесса не наследуясь от TService или TKernelAgent? Все закрыто от посягательств: TService.cur_proc_prio_tag(), TKernelAgent.cur_proc_priority(), TKernelAgent.cur_proc(), Kernel.CurProcPriority. Только через класс типа Public Морозов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...