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

 
 
> Система обмена сообщения между отдельными модулями программы
Слесарь
сообщение May 26 2013, 11:32
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Здравствуйте!
Программирую на С под 8-бит микроконтроллер. Для улучшения динамики работы ПО хочу сделать нечто подобное как сообщения Виндовс. Каждому отдельному модулю ПО выделяется процессорное время, только не квант времени как в Виндовс, а передается процессор на обработку всего что обрабатывает модуль, естественно, модуль должен как можно скорее вернуть процессор для работы следующих модулей. Должен проверить свои данные и сообщения, если новых данных/сообщений нет, вернуть процессор для работы других модулей ПО, следующий по порядку, по кругу.

Отдельные модули ПО могут добавлять сообщения в общий список, другие модули могут получать сообщения и обрабатывать.
Планирую сделать две функции доступные из всех модулей ПО SendMessage и GetMessage, в функции будет передаваться/приниматься хейдер сообщенияи данные. Функция SendMessage добавляет сообщение с указанием хейдера в динамичный список сообщений. Функция GetMessage извлекает сообщение с указанным хейдером или если сообщение отсутствует возвращает NO_MESSAGE.

Вопрос в следующем:
Допустим один модуль шлет сообщения, но еще не существует модуля который может эти сообщения обрабатывать, список сообщений будет расти. Какое должно быть время жизни сообщений, чтоб не забить всю память? Сообщение должно пройти через все модули ПО по кругу и должно уничтожится вернувшись в модуль отправитель?

Правильно ли я мыслю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zöner
сообщение May 26 2013, 22:08
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299



Цитата
Мне непонятно когда эта задача выполнена с использованием одной статической переменной temp, если это выполнено именно так, как второму модулю узнать что данные о температуре актуальны?
очень просто - через вторую стат.переменную (напр. t_rdy). Первый модуль проверяет что t_rdy==0, если так, пишет в temp температуру и 1цу в t_rdy. Второй модуль ждет 1цу - если есть, читает значение temp, и сбрасывает t_rdy в 0.
Так как t_rdy 8-битная, доступ к ней атомарный и никаких доп.средств синхронизации не нужно.
Хотя в большинстве случаев и этого не нужно, можно просто периодически обновлять значение на индикаторе без синхронизации.

В приведенном примере видно что используется просто стек сообщений (или кольцевой буфер) - в одном месте добавляются, в другом - читаются и удаляются.

Сообщение отредактировал zöner - May 26 2013, 22:12
Go to the top of the page
 
+Quote Post
Слесарь
сообщение May 27 2013, 06:45
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



Цитата(zöner @ May 27 2013, 01:08) *
очень просто - через вторую стат.переменную (напр. t_rdy).

Такой стиль программирования не для меня. С таким стилем приходится много думать и помнить, с этим постоянно проблемы.

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

Цитата(Petr_I @ May 27 2013, 01:46) *
Не всегда. В вашем примере если функция вывалится до (или вы забудите написать) DeleteMessage(), сразу получите проблему.
Вообще принято сообщение удалять из очереди при его обработке, т.е. в GetMessage.
И очередь событий нужна, когда у вас действительно ОЧЕРЕДЬ, т.е. одинаковых событий может быть больше чем одно и они должны выполняться в последовательности их поступления.
А судя по вашему примеру это явно избыточные функции.

Есть более простые решения, например:
задайте структуру типа {int flag;int data1;...}
Определите массив таких структур с числом элементов соответствующим общему количеству сообщений.
Определите ваши сообщения типа
#define MESSAGE_SIM900_DTMF 1 /*Индекс в массиве*/
И ваша функция GetMessage будет возвращать структуру из массива по индесу.
flag - используете как флаг актуальноти или счетчик обращений.

Я подвожу к тому чтоб создать некий шаблон оформления программ, на автомате создаем Task() функцию для каждого модуля ПО, как было описано выше в эту функцию поочередно передается процессор, если никаких действий выполнять не требуется, из функции необходимо сделать возврат. В начале функции удаляем все старые сообщения которые могут быть посланы функцией, далее проверяем нет ли новых сообщений которые эта функция может обработать от других модулей, обрабатываем их, и на последок, если произошли события, отправляем новые сообщения из этой функции, возвращаем процессор для других задач. Так поступает любой программный модуль.
Будет удобно создать конструктор который будет генерировать основной шаблон функции Task.
Вы работали когда-нить с MSVS ? Кликаешь вызов конструктора, в окне конструктора вводишь список всех обрабатываемых сообщений, вводишь список сообщений которые будут посылаться из модуля, вводишь другие параметры и нажимаешь ОК, конструктор создает общий шаблон фукции на C, далее программист просто впишет код обработчиков тех или иных входящих сообщений, опишет события при которых будут посланы исходящие сообщения. Никакой путаницы быть не должно.
А если еще многое спрятать под макросы, то должно получиться очень читабельно. хотя макросы я не очень люблю

ДА. Очередь сообщений должна быть правильной, сначала старые одноименные сообщения, потом только новые.

Единственно что сейчас меня беспокоит в таком подходе, это если делать временное тактирование для кождого модуля через систему сообщений. Допустим, в системе требуется самая минимальная задержка для программного обработчика протокола 1-wire, это 6 мкс. , то есть модуль генерирующий сообщения о времени должен каждые 6 мкс слать сообщение MESSAGE_TACT_6MKS, это сообщение должно просуществовать пока не исполнятся все модули ПО и удалиться. Не будет ли разовая работа всех модулей занимать больше времени чем 6 мкс? сообщения могут накапливаться и не успевать вовремя выполняться.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Слесарь   Система обмена сообщения между отдельными модулями программы   May 26 2013, 11:32
- - zöner   чем не устроили статические переменные ?   May 26 2013, 13:29
- - Слесарь   много потребуется статических переменных. не нагля...   May 26 2013, 13:44
- - zöner   данная схема как-то не вяжется с 8-битными контрол...   May 26 2013, 13:46
- - Слесарь   надо писать динамичное ПО, с минимумом проверок ус...   May 26 2013, 14:15
- - ARV   ну так в винде не совсем так: там в каждом приложе...   May 26 2013, 14:50
|- - Слесарь   Цитата(ARV @ May 26 2013, 17:50) ну так в...   May 26 2013, 15:35
|- - ARV   Цитата(Слесарь @ May 26 2013, 19:35) Да. ...   May 26 2013, 17:02
|- - Petr_I   Цитата(Слесарь @ May 26 2013, 19:35) ...н...   May 26 2013, 17:35
|- - Слесарь   Цитата(Petr_I @ May 26 2013, 20:35) По ид...   May 26 2013, 18:07
|- - Petr_I   Цитата(Слесарь @ May 26 2013, 22:07) Опис...   May 26 2013, 20:27
- - zöner   посмотрите в сторону Protothreads - там есть небло...   May 26 2013, 16:10
|- - Слесарь   Цитата(zцner @ May 26 2013, 19:10) посмот...   May 26 2013, 17:06
- - Слесарь   Все дело в том, что могу мыслить только естественн...   May 26 2013, 21:47
|- - Petr_I   Цитата(Слесарь @ May 27 2013, 01:47) Испо...   May 26 2013, 22:46
|- - ARV   Цитата(Слесарь @ May 27 2013, 10:45) Не б...   May 27 2013, 08:07
|- - AlexandrY   Цитата(Слесарь @ May 27 2013, 09:45) Един...   May 27 2013, 08:12
|- - Слесарь   Цитата(AlexandrY @ May 27 2013, 11:12) Хо...   May 27 2013, 14:26
|- - AlexandrY   Цитата(Слесарь @ May 27 2013, 17:26) Да. ...   May 27 2013, 14:42
|- - Слесарь   Цитата(AlexandrY @ May 27 2013, 17:42) за...   May 27 2013, 17:58
- - -SANYCH-   ЦитатаНет. Еще не готов. У самого как-то пока не п...   May 28 2013, 09:19
- - andrewlekar   Во-первых, Вам нужно избавиться от суперлупа и вот...   May 31 2013, 06:02
- - demiurg_spb   2TC: скачайте книгу Кубенского А.А. "Структур...   May 31 2013, 06:45


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

 


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


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