|
|
  |
scmRTOS. Вопросы и ответы. |
|
|
|
Oct 3 2007, 09:46
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(alexander55 @ Oct 3 2007, 11:40)  Вопрос, конечно, правильный. Можно все завести в один процесс, но хочется для самообразования это знать. Вопрос решил так. OS::TEventFlag FL1; OS::TEventFlag FL2; OS::TEventFlag FL3; //--------------------------------------------------------------------------- OS_PROCESS void TProc1::Exec() { FL1.Signal(); for(;;) { if(FL1.Wait()) { ... FL2.Signal(); } } } //--------------------------------------------------------------------------- OS_PROCESS void TProc2::Exec() { for(;;) { if(FL2.Wait()) { ... FL3.Signal(); } } } //--------------------------------------------------------------------------- OS_PROCESS void TProc3::Exec() { for(;;) { if(FL3.Wait()) { ... FL1.Signal(); } } } //--------------------------------------------------------------------------- Хочу увидеть критику и ценные замечания.
Сообщение отредактировал alexander55 - Oct 3 2007, 09:47
|
|
|
|
|
Oct 3 2007, 10:38
|

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

|
Цитата(alexander55 @ Oct 3 2007, 12:46)  Хочу увидеть критику и ценные замечания. Код OS::TEventFlag FL1(OS::TEventFlag::efOn); OS_PROCESS void TProc1::Exec() { for(;;) Но это шлифовка. В остальном должно работать.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 4 2007, 10:00
|

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

|
Цитата(alexander55 @ Oct 4 2007, 10:34)  Правильно ли я понимаю, что минимальный джентальментский набор средств межпроцессного взаимодействия (при этом сохраняя всю функциональность): 1.OS:message 2.OS::channel Нет, OS::TService  Оно работает, но еще не готово к выпуску в широкие массы. А если серьезно - вопрос философский. Я TEventFlag и TMutex использую чаще чем channel и message.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 4 2007, 10:36
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Сергей Борщ @ Oct 4 2007, 14:00)  Нет, OS::TService  Оно работает, но еще не готово к выпуску в широкие массы. И когда ждать? Я себя отношу к широким массам. Цитата(Сергей Борщ @ Oct 4 2007, 14:00)  А если серьезно - вопрос философский. Вот меня и интересует философия scmRTOS. Мне казалось, автор хотел дать минимальный набор универсальных инструментов для решения максимального количества задач.
|
|
|
|
|
Oct 4 2007, 11:53
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(alexander55 @ Oct 4 2007, 17:36)  И когда ждать? Я себя отношу к широким массам. Возьмите из репозитория и пробуйте себя в роли автора.  Цитата(alexander55 @ Oct 4 2007, 17:36)  Вот меня и интересует философия scmRTOS. Мне казалось, автор хотел дать минимальный набор универсальных инструментов для решения максимального количества задач. Универсальных в полном смысле нет и быть не может. Как правило, наиболее часто используемые TEventFlag и TMutex. Исходная идея была, действительно, иметь минимально необходимый набор разнокачественных средств, но так, чтобы не страдала производительность и гибкость от недостатка оных.  Движение в сторону TService обусловлено тем, что все-таки есть случаи, когда кому-то хочется более специализированного поведения и функциональности, чем имеется в наборе.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 8 2007, 05:44
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Спасибо всем за ответы. Предлагаю выкладывать в этом топике ответы на вопросы по использованию встроенных средств межпроцессного взаимодействия в scmRTOS. Это будет интересно всем, кто использует scmRTOS. Например (мой скромный вклад)  . Вопрос. Как средствами scmRTOS организуется выполнение процесса с заданной частотой. Ответ. ... OS::TEventFlag FL3; ... OS_PROCESS void TProc3::Exec() { for(;;) { FL3.Wait(100); ... } } Пояснение. Процесс 3 запускается через 100 тактов системного таймера (период процесса 3 - 100 мс при периоде таймера 1 мс).
|
|
|
|
|
Oct 8 2007, 06:03
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(alexander55 @ Oct 8 2007, 12:44)  Спасибо всем за ответы. Предлагаю выкладывать в этом топике ответы на вопросы по использованию встроенных средств межпроцессного взаимодействия в scmRTOS. Это будет интересно всем, кто использует scmRTOS. Например (мой скромный вклад)  . Вопрос. Как средствами scmRTOS организуется выполнение процесса с заданной частотой. Ответ. ... OS::TEventFlag FL3; ... OS_PROCESS void TProc3::Exec() { for(;;) { FL3.Wait(100); ... } } Пояснение. Процесс 3 запускается через 100 тактов системного таймера (период процесса 3 - 100 мс при периоде таймера 1 мс). Код OS_PROCESS void TProc3::Exec() { for(;;) { Sleep(100); ... } }
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 8 2007, 11:12
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Сергей Борщ @ Oct 8 2007, 12:05)  Оба варианта неправильные - не учитывают время исполнения самого процесса. По-честному надо бы считывать системное время, смотреть сколько осталось до "Часа Х" и засыпать уже на это время. Вот только есть одна грабля - если времени не осталось, то вместо исполнения без ожидания получим Sleep(0), т.е. навечно, а если не успели и "час Х" уже прошел - то опять же вместо исполнения без паузы получим ожидание на время переполнения системного таймера. Вы правы Сергей. Если понадобится точное время, я могу предложить такой вариант. //------------------------------------------------- class TTimer { int Delay; int Setting; public: TTimer(x) { Setting=x;Delay=x;}; void Run(void) { if(--!Delay) {Delay=Setting; FL.Signal();};}; }; //-------------------------------------------------- TTimer Tim100(100); ... И где-то в системном таймере ... Tim100.Run(); ... //-------------------------------------------------- Ну а в процессе OS::TEventFlag FL3; ... OS_PROCESS void TProc3::Exec() { for(;;) { FL.Wait(); ... } } PS. Так вроде чисто получается.
|
|
|
|
|
Oct 8 2007, 11:27
|

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

|
Цитата(alexander55 @ Oct 8 2007, 14:12)  PS. Так вроде чисто получается.  Ну, совсем для красоты я бы сделал FL3 членом TTImer. Инкапсуляция, так сказать. А сам решаю так: Код typedef TTimeout timeout_t; timeout_t Time_X = OS::GetTickCount() + timeout; // now + timeout
for(;;) { timeout_t Timeout = Time_X - OS::GetTickCount(); if((timeout_t)(Timeout - 1) > timeout ) return 0; if(!pUART->getchar(RxData, Timeout)) // timeout, packet broken return 0;
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 8 2007, 11:58
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Сергей Борщ @ Oct 8 2007, 15:27)  Ну, совсем для красоты я бы сделал FL3 членом TTImer. Здесь есть подводный камень с инициализацией (хотя можно наследовать виртуально). Я бы не стал так делать. Цитата(Сергей Борщ @ Oct 8 2007, 15:27)  Код typedef TTimeout timeout_t; timeout_t Time_X = OS::GetTickCount() + timeout; // now + timeout
for(;;) { timeout_t Timeout = Time_X - OS::GetTickCount(); if((timeout_t)(Timeout - 1) > timeout ) return 0; if(!pUART->getchar(RxData, Timeout)) // timeout, packet broken return 0; return 0; Здесь будет выход из цикла for. Это потенциально опасно.
|
|
|
|
|
Oct 8 2007, 13:27
|

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

|
Цитата(alexander55 @ Oct 8 2007, 14:58)  Здесь есть подводный камень с инициализацией (хотя можно наследовать виртуально). Я бы не стал так делать. Какой камень? Что-то я сегодня туго соображаю. Цитата(alexander55 @ Oct 8 2007, 14:58)  return 0; Здесь будет выход из цикла for. Это потенциально опасно.  Это только кусочек функции, которая возвращает количество принятых байт в пакете или 0 если прием не сложился. Этим куском я хотел продемонстрировать вычисление оставшегося тайм-аута и обход упомянутых в предыдущем сообщении "граблей"
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|