|
Использование очереди сообщений |
|
|
|
Nov 27 2009, 08:25
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Здравствуйте. Помогите пожалуйста разобраться с использованием очереди сообщений. У меня есть процесс (A), периодически передающий пакеты по UART. Второй процесс (  может в произвольные моменты требовать от него передачи пакетов, определяемых пользователем. Для этого я собираюсь использовать очередь сообщений. Но ведь в очередь заносится только указатель на пакет, а как быть с самими данными, особенно если пришло несколько запросов подряд? Правильно ли я понимаю, что мне необходимо помимо очереди создать что-то вроде кольцевого буфера и обернуть функции POST и PEND для очереди сообщений в свои функции, которые будут брать/класть указатель из/в очереди, извлекать данные из буфера и обслуживать указатели этого буфера? Спасибо. PS. Пока писал сообщение, в голову пришла ещё одна мысль - процесс B динамически выделяет память, а процесс A после вычитывания сообщения её освобождает.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
 |
Ответов
|
Nov 27 2009, 08:45
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(Dima_G @ Nov 27 2009, 11:32)  Все зависит от того - что подразумеватеся под элементом очереди. Если буфер (+указатель на следующий элемент), то дополнительного пула не нужно))))
Динамически выделять / освобождать память не сильно хорошая идея в embedded системах В большинстве осей, в той же uC/OS в очереди хранятся именно указатели. А по второму замечанию - полностью согласен. Потому, наверное, эта идея пришла только в самый последний момент (как самая негодная)
Сообщение отредактировал Harvester - Nov 27 2009, 08:47
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Nov 27 2009, 08:53
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(Harvester @ Nov 27 2009, 12:45)  В большинстве осей, в той же uC/OS в очереди хранятся именно указатели. Ну а что мешает сделать свою очередь? Ни либо на указателях я бы делал так: хранил отдельно пул буферов Создал бы очередь - обозвал бы ее FreeQueue Создал бы очередь в драйвере - назвал TxQueue; Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue как-то так
|
|
|
|
|
Nov 27 2009, 11:38
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(Dima_G @ Nov 27 2009, 11:53)  Ну а что мешает сделать свою очередь? Ни либо на указателях я бы делал так: хранил отдельно пул буферов Создал бы очередь - обозвал бы ее FreeQueue Создал бы очередь в драйвере - назвал TxQueue; Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue как-то так  А ведь так можно вообще обойтись без очереди - использовать пул буферов и счётный семафор!
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Nov 27 2009, 11:59
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Harvester @ Nov 27 2009, 14:38)  А ведь так можно вообще обойтись без очереди - использовать пул буферов и счётный семафор! Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе. Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все. Цитата(Harvester @ Nov 27 2009, 11:45)  В большинстве осей, в той же uC/OS в очереди хранятся именно указатели. В большинстве - хранится все, что хочется. Вопрос только в допустимости накладных расходов. Если функций работы с очередью позволяют прямой доступ к буферу очереди, без копирования тела сообщений, то это уже без чрезмерных затрат позволяет действительно гонять через очередь и данные. Цитата(Dima_G @ Nov 27 2009, 11:32)  Динамически выделять / освобождать память не сильно хорошая идея в embedded системах Зависит от менеджера памяти, нагрузки и необходимости экономии ресурсов. В большинстве случаев организация буферизации через динамически выделяемые блоки на одно сообщение, действительно, чрезмерно заумна.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 27 2009, 12:23
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Nov 27 2009, 15:59)  Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе. Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все. Под буфером, Вы имеете в виду - циклический буфер? Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы, как следствие - потери информации о типе вложенного объекта
|
|
|
|
|
Nov 27 2009, 13:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dima_G @ Nov 27 2009, 15:23)  Под буфером, Вы имеете в виду - циклический буфер? Совершенно не имеет значения какой - любой, какой оптимален для данного типа данных, нагрузки и прочего. Довольно часто очень просто и удобно реализуются линейные под фрейм расположенные внутри кольцевого. А если фреймы фиксированной длинны, то сам бог велел так делать - 0 недостатков. Цитата Мне большей частью удобнее НЕ использовать системные очереди. Исключительно из-за их "сишной" природы, как следствие - потери информации о типе вложенного объекта Еруда полная, а не причина, либо тип фиксирован, либо Вы его по любому будете восстанавливать по, например, заголовку. Цитата(Harvester @ Nov 27 2009, 15:47)  И если очередь не полна,значит, как минимум, одно из самых ранних сообщение уже вычитано и отправитель может писать данные в очередную секцию кольцевого буфера. И если полна, то тоже может, ибо должны быть ДВА указателя - на чтение, который проходит через очередь до процесса передачи читающий из буфера передачи и отдельно болтающийся указатель на запись, по которому вне зависимости (ну кроме контроля за фатальным переполнением) от наличия в буфере непереданных фреймов осуществляется запись.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 27 2009, 13:41
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Nov 27 2009, 16:03)  И если полна, то тоже может, ибо должны быть ДВА указателя - на чтение, который проходит через очередь до процесса передачи читающий из буфера передачи и отдельно болтающийся указатель на запись, по которому вне зависимости (ну кроме контроля за фатальным переполнением) от наличия в буфере непереданных фреймов осуществляется запись. Что-то теперь я совсем запутался.  Как может указатель на запись"отдельно болтаться", если именно его необходимо класть в очередь после заполнения фрейма буфера. И потом, если уж мы используем два указателя, т.е. организуем кольцевой буфер, то какой смысл в очереди? Проще ведь будет использовать счетный семафор, да и по ресурсам выгоднее.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Nov 27 2009, 15:42
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Harvester @ Nov 27 2009, 16:41)  Что-то теперь я совсем запутался.  Как может указатель на запись"отдельно болтаться", если именно его необходимо класть в очередь после заполнения фрейма буфера. Вопросы кто чем для кого является  возможен взгляд с разных сторон  . В очередь кладется указатель чтения - по нему процесс передачи читает из буфера, то, что он будет передавать  . Указатель записи это принадлежность функции, которая заполняет буфер передачи - по нему будет занесен фрейм и его значение до занесения фрейма будет помещено в очередь. Цитата И потом, если уж мы используем два указателя, т.е. организуем кольцевой буфер, то какой смысл в очереди? Проще ведь будет использовать счетный семафор, да и по ресурсам выгоднее. То, что Вы пытаетесь описать, вообще буфера не требует  , поскольку Вы упорно предполагаете, что в кольцевом буфере по определению рассчитанном на МНОГО фреймов лежит ОДИН. Для одного нужен ОДИН указатель - нет вопросов. Если Мы действительно используем кольцевой буфер, как буфер, а не лишнюю приблуду, то в нем могут лежать МНОГО фреймов, для них нужно МНОГО указателей. Эти указатели и лежат в очереди до того момента, когда процесс передачи извлечет очередной и начнет по нему вытаскивать из буфера информацию. Цитата(Dima_G @ Nov 27 2009, 17:57)  соответственно, никто не застрахован от ошибок Поверье мне, что ошибок Вы и так наделаете. Цитата В С++ можно использовать такой подход Ненужные выкрутасы на ровном месте для ЧАСТНОГО случая. Ничего, кроме лишнего разнообразия в решении не дает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 27 2009, 16:11
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Nov 27 2009, 18:42)  Поверье мне, что ошибок Вы и так наделаете.
Ненужные выкрутасы на ровном месте для ЧАСТНОГО случая. Ничего, кроме лишнего разнообразия в решении не дает. Это я уже обсуждать не буду, а то тема сведется к холивару С vs С++. Остановимся на том, что почему-то мне так удобнее  Цитата(Andron_ @ Nov 27 2009, 19:12)  а можно аргументировать? сам применяю new/delete и пытаюсь понять - будут грабли или нет. Можно столкнуться с фрагментацией памяти Ненормированное время выделения памяти Нереентерабельность выделения памяти Ну и мое ИМХО - при статическом распределении ресурсов система более предсказуема  вот, почитайте - зедсь есть немного про это http://www.embedded.com/story/OEG20020222S0026
Сообщение отредактировал Dima_G - Nov 27 2009, 16:15
|
|
|
|
|
Nov 27 2009, 16:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dima_G @ Nov 27 2009, 19:11)  Это я уже обсуждать не буду, а то тема сведется к холивару С vs С++. Остановимся на том, что почему-то мне так удобнее  C++ тут АБСОЛЮТНО ни причем - на любом языке можете наваять оберток не имеющих никакого смысла и главное годящихся только для частного случая. Изобразить, например, "специальную очередь" для какого-либо фрейма можно по любому, только кроме лишнего исходного текста и лишних сущностей такие выкрутасы не дают ничего. Цитата(Dima_G @ Nov 27 2009, 19:11)  Можно столкнуться с фрагментацией памяти А можно и нет, если принять меры. Цитата Ненормированное время выделения памяти Ну не надо использовать, например, линукс с файлами подкачки и прочим. Хотя именно в том-же линуксе драйвера делают и много много более мрачные системные вызовы  Цитата Нереентерабельность выделения памяти Ну это если совсем без головы на плечах. Цитата Ну и мое ИМХО - при статическом распределении ресурсов система более предсказуема  Эх, конечно. Только вот если с ресурсами напряг и всем нарезать их про запас не хватает?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 28 2009, 09:30
|

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

|
Цитата(zltigo @ Nov 27 2009, 22:49)  C++ тут АБСОЛЮТНО ни причем - на любом языке можете наваять оберток не имеющих никакого смысла и главное годящихся только для частного случая. Изобразить, например, "специальную очередь" для какого-либо фрейма можно по любому, только кроме лишнего исходного текста и лишних сущностей такие выкрутасы не дают ничего. Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 28 2009, 10:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(dxp @ Nov 28 2009, 12:30)  Вы хотите сказать, что очередь на основе void* ничем не хуже очереди на основе TypeName*? С точки зрения удобства и безопасности использования. Я хочу сказать, что TypeName* ничем не лучше и делать нечто самодельное похожее на очередь ВМЕСТО механизма очередей системы, по причине того, что очередь с void* есть глупость. Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например Цитата #define put_typename( x ) { TypeName *tmp = x; put( tmp ); } для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Nov 28 2009, 17:40
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Nov 28 2009, 13:07)  Причем эта поделка не годится, если мы в очередь кладем разные сообщения. Да и если только один тип, то пользы от нее как от козла молока, ибо извлечение из очереди в большинстве случаев в одном месте и ошибиться с приведением (TypeName *) это надо сильно постараться, как и запихнуть в одном-нескольких местах программы очередь нечто другое. Эти экзерсисы что-то вроде подстелить несколько пучков соломки на землю для страховки при возможном падении с 5 этажа - хуже не будет, но и реальной пользы от лишних телодвижений никакой. Родить какую-нибудь конструкцию, например
для "защиты" и создания лишней "своей" очереди я могу и на 'C', только находясь в здравом уме делать такого не буду, а уж тем более изготавливать костыли с TypeName* ВМЕСТО штатной очереди. Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового.  В шаблонную очередь (пример выше) мы можем класть не только объектры ELEMENT, но и наследников от него. Это про "разные сообщения" Далее - насчет "запихнуть не то - невозвожно". Да леко! Я кончено понимаю, что специалист Вашего уровня никогда не ошибается, но у меня могут быть промашки - при 10 очередях и 20 типах объектов, которые "гуляют" по ним. И любые средства языка, которые хоть немного могут это предотвратить, я очень приветствую.
|
|
|
|
|
Nov 28 2009, 18:03
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dima_G @ Nov 28 2009, 20:40)  Это про "разные сообщения" А, блин, при выемке распознавать святым духом.... Зачем мелкие дежурные "мероприятия". Цитата Ничего личного, но сразу видно отличие Сишного стиля мышления от Сиплюсового. Разница много больше проявляется в отсутствии/наличии мышления.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Harvester Использование очереди сообщений Nov 27 2009, 08:25             dxp Цитата(zltigo @ Nov 28 2009, 16:07) Я хоч... Nov 29 2009, 15:55              zltigo Цитата(dxp @ Nov 29 2009, 18:55) Нет ни о... Dec 3 2009, 08:09               Dima_G Цитата(zltigo @ Dec 3 2009, 11:09) Вы пох... Dec 3 2009, 08:26              zltigo Цитата(dxp @ Nov 29 2009, 18:55) все выше... Dec 3 2009, 08:58               dxp Цитата(zltigo @ Dec 3 2009, 14:58) Самые ... Dec 4 2009, 09:18                Dima_G Цитата(dxp @ Dec 4 2009, 12:18) Не ... Dec 4 2009, 09:50                zltigo Цитата(dxp @ Dec 4 2009, 12:18) добавив ч... Dec 4 2009, 10:06                 dxp Цитата(zltigo @ Dec 4 2009, 16:06) И выну... Dec 5 2009, 07:22         Harvester Цитата(zltigo @ Nov 27 2009, 18:42) Вопро... Nov 30 2009, 07:36       Dima_G Цитата(zltigo @ Nov 27 2009, 16:03) Еруда... Nov 27 2009, 14:57     Harvester Цитата(zltigo @ Nov 27 2009, 14:59) Нафиг... Nov 27 2009, 12:47 Andron_ ЦитатаДинамически выделять / освобождать память не... Nov 27 2009, 15:12 Ink ЦитатаВ шаблонную очередь (пример выше) мы можем к... Nov 29 2009, 02:14 Сергей Борщ Цитата(Ink @ Nov 29 2009, 04:14) если вы ... Nov 29 2009, 10:52  Ink Цитата(Сергей Борщ @ Nov 29 2009, 13:52) ... Nov 29 2009, 17:33   Сергей Борщ Цитата(Ink @ Nov 29 2009, 19:33) если фун... Nov 30 2009, 01:18    Ink Цитата(Сергей Борщ @ Nov 30 2009, 04:18) ... Dec 2 2009, 10:32     dxp Цитата(Ink @ Dec 2 2009, 16:32) согласен,... Dec 3 2009, 07:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|