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

 
 
> Использование очереди сообщений
Harvester
сообщение Nov 27 2009, 08:25
Сообщение #1


Местный
***

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



Здравствуйте.

Помогите пожалуйста разобраться с использованием очереди сообщений.
У меня есть процесс (A), периодически передающий пакеты по UART. Второй процесс (cool.gif может в произвольные моменты требовать от
него передачи пакетов, определяемых пользователем. Для этого я собираюсь использовать очередь сообщений.
Но ведь в очередь заносится только указатель на пакет, а как быть с самими данными, особенно если пришло несколько запросов подряд?

Правильно ли я понимаю, что мне необходимо помимо очереди создать что-то вроде кольцевого буфера и обернуть функции POST и PEND для очереди сообщений в свои функции, которые будут брать/класть указатель из/в очереди, извлекать данные из буфера и обслуживать указатели этого буфера?

Спасибо.

PS. Пока писал сообщение, в голову пришла ещё одна мысль - процесс B динамически выделяет память, а процесс A после вычитывания сообщения её освобождает.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dima_G
сообщение Nov 27 2009, 08:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



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

Динамически выделять / освобождать память не сильно хорошая идея в embedded системах
Go to the top of the page
 
+Quote Post
Harvester
сообщение Nov 27 2009, 08:45
Сообщение #3


Местный
***

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



Цитата(Dima_G @ Nov 27 2009, 11:32) *
Все зависит от того - что подразумеватеся под элементом очереди. Если буфер (+указатель на следующий элемент), то дополнительного пула не нужно))))

Динамически выделять / освобождать память не сильно хорошая идея в embedded системах


В большинстве осей, в той же uC/OS в очереди хранятся именно указатели.

А по второму замечанию - полностью согласен. Потому, наверное, эта идея пришла только в самый последний момент (как самая негодная) smile.gif

Сообщение отредактировал Harvester - Nov 27 2009, 08:47


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
Dima_G
сообщение Nov 27 2009, 08:53
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699



Цитата(Harvester @ Nov 27 2009, 12:45) *
В большинстве осей, в той же uC/OS в очереди хранятся именно указатели.


Ну а что мешает сделать свою очередь?

Ни либо на указателях я бы делал так:
хранил отдельно пул буферов

Создал бы очередь - обозвал бы ее FreeQueue
Создал бы очередь в драйвере - назвал TxQueue;

Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue

Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue


как-то так smile.gif
Go to the top of the page
 
+Quote Post
Harvester
сообщение Nov 27 2009, 11:38
Сообщение #5


Местный
***

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



Цитата(Dima_G @ Nov 27 2009, 11:53) *
Ну а что мешает сделать свою очередь?

Ни либо на указателях я бы делал так:
хранил отдельно пул буферов

Создал бы очередь - обозвал бы ее FreeQueue
Создал бы очередь в драйвере - назвал TxQueue;

Далее - приложение берет из очереди FreeQueue указатель (считай - буфер), заполняет буфер и помещает указатель на него в TxQueue

Драйвер обнаруживет в TxQueue пакет, обрабатывает его (передает), и помещает в FreeQueue


как-то так smile.gif

А ведь так можно вообще обойтись без очереди - использовать пул буферов и счётный семафор!


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 27 2009, 11:59
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Harvester
сообщение Nov 27 2009, 12:47
Сообщение #7


Местный
***

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



Цитата(zltigo @ Nov 27 2009, 14:59) *
Нафига организовывать очередь руками из дополнительного буфера и семафора, если их поддержка УЖЕ ЕСТЬ в системе.

Вообще-то это не я придумал. Это написал Лабросс в книге по uC/OS, как пример использования счетного семафора.

Цитата(zltigo @ Nov 27 2009, 14:59) *
Если очередь можно пользовать только для указателей, то нужно только добавить к ней один буфер и все.

Действительно, как-то сразу не подумал. Ведь ядро уже контролирует заполненность очереди. И если очередь не полна,
значит, как минимум, одно из самых ранних сообщение уже вычитано и отправитель может писать данные в очередную секцию кольцевого буфера.
Это действительно проще связного списка.

Спасибо!

Сообщение отредактировал Harvester - Nov 27 2009, 12:47


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Harvester   Использование очереди сообщений   Nov 27 2009, 08:25
|- - Dima_G   Цитата(zltigo @ Nov 27 2009, 15:59) Нафиг...   Nov 27 2009, 12:23
||- - zltigo   Цитата(Dima_G @ Nov 27 2009, 15:23) Под б...   Nov 27 2009, 13:03
||- - 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
||- - Dima_G   Цитата(zltigo @ Nov 27 2009, 16:03) Еруда...   Nov 27 2009, 14:57
- - 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


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:17
Рейтинг@Mail.ru


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