|
Использование очереди сообщений |
|
|
|
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:47
|
Местный
  
Группа: Участник
Сообщений: 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
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|