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

Как правильно пользоваться OS::message?

Я как-то до сих пор обходился без OS::message, но недавно решил восполнить этот пробел:)

Вот кусок из примера 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();

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

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


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

Я правильно понимаю, что если в "месте А" произойдёт прерывание от системного таймера, то сообщение от TProc3 будет перезаписано?

То есть, принимающий процесс вместо пары сообщений "сообщение от TProc3 + сообщение от таймера" получит два раза сообщение от таймера?

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

 

Как этого избежать? Обрамлять блок

        MamontMsg = m;
        MamontMsg.send();

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

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

 

 

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

 

Использовать каналы.

 

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


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

Да, жалко. Получается, сообщения практически бесполезны в нынешнем своём виде :(

(Каналы с указателями на объекты-сообщения я как раз и использую сейчас, хотел упростить немного).

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


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

Продолжу тему :(

 

Если в любом прерывании сделать так:

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

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


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

получит два сообщения с Mamount.data = 2
Забавно. Особенно учитывая, что счетчика там нет. Подозреваю, что пример не точен.

 

так и должно быть?
Вот прямо так не должно быть. Должен быть один самый последний мамонт.

 

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


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

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

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

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

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

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

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

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

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

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