Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как правильно пользоваться OS::message?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
AHTOXA
Я как-то до сих пор обходился без OS::message, но недавно решил восполнить этот пробелsm.gif
Вот кусок из примера 2-Message:
Код
OS_PROCESS void TProc3::exec() {
    for (;;)   {
        TMamont m;
        ...
        MamontMsg = m;
        PB0.On();             // место А
        MamontMsg.send();
    }
}

void OS::system_timer_user_hook() {
    TMamont m;
    ...
    MamontMsg = m;
    MamontMsg.send_isr();
}

Я правильно понимаю, что если в "месте А" произойдёт прерывание от системного таймера, то сообщение от TProc3 будет перезаписано?
То есть, принимающий процесс вместо пары сообщений "сообщение от TProc3 + сообщение от таймера" получит два раза сообщение от таймера?
Как этого избежать? Обрамлять блок
Код
        MamontMsg = m;
        MamontMsg.send();

в критическую секцию? Есть ли какие-то другие варианты?
_Артём_
Цитата(AHTOXA @ Jun 18 2013, 08:52) *
Я правильно понимаю, что если в "месте А" произойдёт прерывание от системного таймера, то сообщение от TProc3 будет перезаписано?
То есть, принимающий процесс вместо пары сообщений "сообщение от TProc3 + сообщение от таймера" получит два раза сообщение от таймера?

Похоже так - будет два сообщения от таймера.

Цитата(AHTOXA @ Jun 18 2013, 08:52) *
Как этого избежать? Обрамлять блок
Код
        MamontMsg = m;
        MamontMsg.send();

в критическую секцию? Есть ли какие-то другие варианты?

Критическая секция тоже не поможет: в MamontMsg.send начнётся передача управления процессу Proc1, где-нибудь там разрешаться прерывания и произойдёт таймерное прерывание с вызовом MamontMsg.send_isr. Разница будет в том что сообщение будет одно, а не два.


Цитата(AHTOXA @ Jun 18 2013, 08:52) *
Есть ли какие-то другие варианты?


Использовать каналы.
AHTOXA
Да, жалко. Получается, сообщения практически бесполезны в нынешнем своём виде sad.gif
(Каналы с указателями на объекты-сообщения я как раз и использую сейчас, хотел упростить немного).
Kot_dnz
Продолжу тему sad.gif

Если в любом прерывании сделать так:
Код
void  any_isr(){
   TMamount m;
   m.data = 1;
   MamountMsg = m;
   MamountMsg.send_isr();
   m.data = 2;
   MamountMsg = m;
   MamountMsg.send_isr();
}


то обработчик в proc вида
Код
MamontMsg.wait();          // wait for message
MamontMsg.out(Mamont);     // read message content to global test object


получит два сообщения с Mamount.data = 2
так и должно быть?
Сергей Борщ
Цитата(Kot_dnz @ Jul 11 2014, 16:55) *
получит два сообщения с Mamount.data = 2
Забавно. Особенно учитывая, что счетчика там нет. Подозреваю, что пример не точен.

Цитата(Kot_dnz @ Jul 11 2014, 16:55) *
так и должно быть?
Вот прямо так не должно быть. Должен быть один самый последний мамонт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.