Jump to content

    
URAN

Начало работы с scmRTOS

Recommended Posts

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

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
        {
           // заданий нет, делаем фоновую работу
        }
    }
}

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
3 часа назад, dxp сказал:

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

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

Share this post


Link to post
Share on other sites
3 hours ago, Сергей Борщ said:

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.