|
Использование очереди сообщений |
|
|
|
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, 14:57
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(zltigo @ Nov 27 2009, 16:03)  Еруда полная, а не причина, либо тип фиксирован, либо Вы его по любому будете восстанавливать по, например, заголовку. Реализации универсальных сишных очередей, которые я видел - обычно работают с void указателем на элемент: Код push(void* pObj_); void* pop(); соответственно, никто не застрахован от ошибок В С++ можно использовать такой подход Цитата template <class ELEMENT>\ class TClQueue { push(ELEMENT* pclEl_); ELEMENT* pop();
}; В эту очередь получится запихать либо ELEMENT, либо производные от него
|
|
|
|
Сообщений в этой теме
Harvester Использование очереди сообщений Nov 27 2009, 08:25       Harvester Цитата(zltigo @ Nov 27 2009, 16:03) И есл... Nov 27 2009, 13:41        zltigo Цитата(Harvester @ Nov 27 2009, 16:41) Чт... Nov 27 2009, 15:42         Dima_G Цитата(zltigo @ Nov 27 2009, 18:42) Повер... Nov 27 2009, 16:11          zltigo Цитата(Dima_G @ Nov 27 2009, 19:11) Это я... Nov 27 2009, 16:49           dxp Цитата(zltigo @ Nov 27 2009, 22:49) C++ т... Nov 28 2009, 09:30            zltigo Цитата(dxp @ Nov 28 2009, 12:30) Вы хотит... Nov 28 2009, 10:07             Dima_G Цитата(zltigo @ Nov 28 2009, 13:07) Приче... Nov 28 2009, 17:40              zltigo Цитата(Dima_G @ Nov 28 2009, 20:40) Это п... Nov 28 2009, 18:03             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     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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|