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

 
 
> Keil RTX-kernel и прием/передача по UART, Как лучше организовать взаимодействие?
Shein
сообщение Feb 27 2011, 14:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Доброго времени суток!
Есть проект с использованием RTX-kernel. Нужно организовать прием/передачу данных по UART. Т.к. скорости маленькие 4800/9600, то хочется снизить время бесполезного простоя системы в ожидании готовности приемника или передатчика - есть масса другой работы по обработке данных. Вот раздумываю как это сделать правильнее, красивее, с точки зрения RTOS.

С приемом, в общем, более-менее понятно. Включены прерывания по приему символа (ПДП пока не используется) и в обработчике принятый символ через mailbox отправляется задаче обрабатывающей прием.

Передачу, на данный момент сделал так:
Разрешил прерывания по готовности передатчика, в обработчике прерывания устанавливается событие "передатчик готов", а уже задача, ответственная за передачу, по этому событию пишет данные в буфер UART'a.
Минусы: обработчик прерывания один. Поэтому, когда нет данных для передачи, но идет прием, обработчик прерывания вызванный приемником, ставит и событие готовности передатчика (бит в статусе USART TXRDY ведь установлен). При этом получается что будет установка уже установленного события. Есть ли тут криминал, не знаю. В доках по этому поводу ничего не нашел.

Рассматривал вариант организации передачи тоже через mailbox. Во-первых мне показалось это излишним усложнением. во-вторых, обработчик прерывания вызывается при освобождении передатчика. А если данные появились позже?

Ну и третий вариант, просто сделать задачу передачи с низшим приоритетом, и просто пулингом ждать освобождения передатчика, без прерываний. Другие задачи будут ее о необходимости прерывать. Уж совсем как-то некрасиво, да и задача передатчика не самая низшая по приоритетности.

В общем, интересно, кто какие подходы использует?

Не думаю что это имеет значение, но на всякий случай, контроллер AT91SAM7X...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
serbor
сообщение Mar 13 2011, 19:41
Сообщение #2





Группа: Новичок
Сообщений: 1
Регистрация: 28-05-09
Пользователь №: 49 695



Тоже приценивался к этой операционке. А что она работает только как раунд-робин? Мне показалось, что там есть возможность вытеснения.
Go to the top of the page
 
+Quote Post
Shein
сообщение Mar 15 2011, 18:08
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(serbor @ Mar 13 2011, 21:41) *
Тоже приценивался к этой операционке. А что она работает только как раунд-робин? Мне показалось, что там есть возможность вытеснения.

нет, не только. Раунд-робин можно включать или нет в конфигурационном файле. Т.е на этапе компиляции можно выбрать пользоваться раунд-робин или обычной вытесняющей многозадачностью.
Go to the top of the page
 
+Quote Post
sinc_func
сообщение Mar 22 2011, 18:16
Сообщение #4


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

Группа: Участник
Сообщений: 107
Регистрация: 29-05-10
Из: Пенза
Пользователь №: 57 619



В подобной задаче я ориентируюсь на такой вариант
-использование FIFO UARTa (для LPCxxx) должно дать временной буфер где-то в 15-30 ms,
что много больше чем типичный tick,
- под обслуживание UARTa выделяется чисто отдельная задача с круговым опросом
статуса UARTa по приему, статуса по передаче и связью с кучей других задач через
выделенный mailbox(ы)...и никаких прерываний,
- такую пробную версию я сделал на Round-Robin-е - впечатление- приятное ..
- при отсутсвии каких-то "шевелений" в статусах этой задачи и необходимости чего-то
"окучивать" - эта задача просто отдает активный статус через os_tsk_pass() другой задаче

Конечно, это простое решение можно покритиковать - но это простое решение
Go to the top of the page
 
+Quote Post
Shein
сообщение Mar 25 2011, 09:01
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 45
Регистрация: 4-03-07
Пользователь №: 25 855



Цитата(sinc_func @ Mar 22 2011, 20:16) *
- при отсутсвии каких-то "шевелений" в статусах этой задачи и необходимости чего-то
"окучивать" - эта задача просто отдает активный статус через os_tsk_pass() другой задаче

Цитата
The os_tsk_pass function passes control to the next task of the same priority in the ready queue. If there is no task of the same priority in the ready queue, the current task continues and no task switching occurs.

Нсколько я понял из описания, задаче с меньшим приоритетом os_tsk_pass управлени не отдаст. Кто-нить проверял как оно на практике?
Round-robin не пользую.
Go to the top of the page
 
+Quote Post
sinc_func
сообщение Apr 8 2011, 13:19
Сообщение #6


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

Группа: Участник
Сообщений: 107
Регистрация: 29-05-10
Из: Пенза
Пользователь №: 57 619



Цитата(Shein @ Mar 25 2011, 13:01) *
Нсколько я понял из описания, задаче с меньшим приоритетом os_tsk_pass управлени не отдаст. Кто-нить проверял как оно на практике?
Round-robin не пользую.


У себя в задачах я ориентируюсь пока только на Round-robin
(не хочется напрягаться и тянуть без должной мотивации систему приоритетов)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 22:55
Рейтинг@Mail.ru


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