реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как правильно пользоваться OS::message?
AHTOXA
сообщение Jun 18 2013, 05:52
Сообщение #1


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я как-то до сих пор обходился без 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();

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 18 2013, 16:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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) *
Есть ли какие-то другие варианты?


Использовать каналы.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 18 2013, 16:49
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Kot_dnz
сообщение Jul 11 2014, 13:55
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 4-07-14
Пользователь №: 82 154



Продолжу тему 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, 13:56
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 12 2014, 06:39
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Цитата(Kot_dnz @ Jul 11 2014, 16:55) *
так и должно быть?
Вот прямо так не должно быть. Должен быть один самый последний мамонт.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016