AHTOXA 14 18 июня, 2013 Опубликовано 18 июня, 2013 · Жалоба Я как-то до сих пор обходился без 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(); в критическую секцию? Есть ли какие-то другие варианты? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 18 июня, 2013 Опубликовано 18 июня, 2013 · Жалоба Я правильно понимаю, что если в "месте А" произойдёт прерывание от системного таймера, то сообщение от TProc3 будет перезаписано? То есть, принимающий процесс вместо пары сообщений "сообщение от TProc3 + сообщение от таймера" получит два раза сообщение от таймера? Похоже так - будет два сообщения от таймера. Как этого избежать? Обрамлять блок MamontMsg = m; MamontMsg.send(); в критическую секцию? Есть ли какие-то другие варианты? Критическая секция тоже не поможет: в MamontMsg.send начнётся передача управления процессу Proc1, где-нибудь там разрешаться прерывания и произойдёт таймерное прерывание с вызовом MamontMsg.send_isr. Разница будет в том что сообщение будет одно, а не два. Есть ли какие-то другие варианты? Использовать каналы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 18 июня, 2013 Опубликовано 18 июня, 2013 · Жалоба Да, жалко. Получается, сообщения практически бесполезны в нынешнем своём виде :( (Каналы с указателями на объекты-сообщения я как раз и использую сейчас, хотел упростить немного). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kot_dnz 0 11 июля, 2014 Опубликовано 11 июля, 2014 (изменено) · Жалоба Продолжу тему :( Если в любом прерывании сделать так: 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 так и должно быть? Изменено 11 июля, 2014 пользователем Kot_dnz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 12 июля, 2014 Опубликовано 12 июля, 2014 · Жалоба получит два сообщения с Mamount.data = 2Забавно. Особенно учитывая, что счетчика там нет. Подозреваю, что пример не точен. так и должно быть?Вот прямо так не должно быть. Должен быть один самый последний мамонт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться