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

 
 
> Буфер на UART.
Jenya7
сообщение Sep 27 2016, 11:52
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Раньше все было просто - принял чар, отправил чар. Но сейчас работаю с TMS320F28335. У этого контроллера есть буфер на прием и посылку. И я здумался как его лучше использовать. У него есть обычные прерывания приема/посылки и есть прерывания уровня наполнения буфера. Но я не хочу использовать прерывания буфера так как не знаю сколько чаров получу. Как вообще лучше использовать буфер?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Obam
сообщение Sep 27 2016, 12:28
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Jenya7 @ Sep 27 2016, 15:52) *
Раньше все было просто - принял чар, отправил чар. Но сейчас работаю с TMS320F28335. У этого контроллера есть буфер на прием и посылку. И я здумался как его лучше использовать. У него есть обычные прерывания приема/посылки и есть прерывания уровня наполнения буфера. Но я не хочу использовать прерывания буфера так как не знаю сколько чаров получу. Как вообще лучше использовать буфер?


Вы 16550 в персональном компьютере использовали? Вот и здесь так же.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 27 2016, 12:32
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Obam @ Sep 27 2016, 17:28) *
Вы 16550 в персональном компьютере использовали? Вот и здесь так же.

!!! ??? !!! ???


на обычном прерывании мог бы сделать так.
Код
If (ScibRegs.SCIRXST.bit.RXRDY)  //char is received
{
     while (ScibRegs.SCIFFRX.bit.RXFFST > 0)  //there are chars in FIFO
    {
        rx_data[i++]=ScibRegs.SCIRXBUF.all;
    }
}

но тогда польза от буфера никакая.

Сообщение отредактировал Jenya7 - Sep 27 2016, 13:25
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 27 2016, 15:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Jenya7 @ Sep 27 2016, 18:32) *
на обычном прерывании мог бы сделать так.
но тогда польза от буфера никакая.

польза от буфера такая, что если данных много идёт, можно не на каждый байт дергаться, а в шеснадцать раз реже. и забирать из уарта по несколько байт сразу.
ну и чтобы пару байт не висели долго пока буфер не заполнится, можно периодически SciaRegs.SCIFFRX.bit.RXFFST поллить, когда делать больше нечего.

но если надо на каждый отдельный байт уметь быстро среагировать, тогда да, поставте просто прерывание по заполнению буфера на 1 байт и дергайтесь по каждому байту. от буфера пользы тогда действительно никакой.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 27 2016, 15:52
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(_pv @ Sep 27 2016, 20:22) *
польза от буфера такая, что если данных много идёт, можно не на каждый байт дергаться, а в шеснадцать раз реже. и забирать из уарта по несколько байт сразу.
ну и чтобы пару байт не висели долго пока буфер не заполнится, можно периодически SciaRegs.SCIFFRX.bit.RXFFST поллить, когда делать больше нечего.

но если надо на каждый отдельный байт уметь быстро среагировать, тогда да, поставте просто прерывание по заполнению буфера на 1 байт и дергайтесь по каждому байту. от буфера пользы тогда действительно никакой.


О! Вот я и говорю - проверять RXRDY=1 полингом или RXFFST>0. мне не нужно немедленно реагировать у юарта приоритет низкий, может и подождать.
буфер дает уверенность в завтрашнем дне. я правильно понимаю?

Цитата(Сергей Борщ @ Sep 27 2016, 20:48) *
А UART тем более телепатией не обладает. Настраивайте таймаут в UART на некоторый допустимый межбайтовый интервал и ждете либо прерывания по этому таймауту, либо прерывания по заполнению (половины) буфера. По любому из этих прерываний разгребаете все, что пришло и делаете вывод - ждать следующей порции данных или уже принят весь пакет. Примерно так.

а что такое половина буфера? а если придет 4 чара?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2016, 16:11
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Sep 27 2016, 18:52) *
а что такое половина буфера? а если придет 4 чара?
Если у вас буфер на 16 байт, поставьте прерывание на прием 8. Пока вы отреагируете на этот запрос прерывания и будете их обрабатывать, у вас будет запас по времени на прием еще 8. Когда примутся эти вторые 8 - вы уже успеете освободить место от первых восьми и у вас в буфере снова будет свободное место когда вы приступите к обработке второй половины. А если придет 4 символа из 8 - вы получите прерывание УАПП по таймауту и в его обработчике сможете обработать эти 4.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 27 2016, 16:41
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Sep 27 2016, 21:11) *
Если у вас буфер на 16 байт, поставьте прерывание на прием 8. Пока вы отреагируете на этот запрос прерывания и будете их обрабатывать, у вас будет запас по времени на прием еще 8. Когда примутся эти вторые 8 - вы уже успеете освободить место от первых восьми и у вас в буфере снова будет свободное место когда вы приступите к обработке второй половины. А если придет 4 символа из 8 - вы получите прерывание УАПП по таймауту и в его обработчике сможете обработать эти 4.

юзер послал команду на 4 чара и пошел кофе пить. мне придется ждать когда он пошлет мне следующую команду.

Цитата(jcxz @ Sep 27 2016, 21:31) *
Нет. Любая буферизация даёт уменьшение загрузки CPU на обслуживание периферии или возможность монопольно занять CPU на большее время (запретив прерывания). Не используя при этом DMA, каналов которого может не хватать.

ну это то что нам надо. плюс чары не теряются.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2016, 16:48
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Sep 27 2016, 19:41) *
юзер послал команду на 4 чара и пошел кофе пить. мне придется ждать когда он пошлет мне следующую команду.

Прочитайте все же последнее предложение из сообщения Сергея.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 27 2016, 17:59
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Sep 27 2016, 21:48) *
Прочитайте все же последнее предложение из сообщения Сергея.

а как выбрать интервал таймаута? юзер может делать сколь угодно долгие паузы между символами.
Go to the top of the page
 
+Quote Post
_pv
сообщение Sep 27 2016, 18:14
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Jenya7 @ Sep 27 2016, 23:59) *
а как выбрать интервал таймаута? юзер может делать сколь угодно долгие паузы между символами.

таймаут на поллинг RXFFST на приёмнике.
то есть если данных много и идут непрерывно, будет на каждые 8 или 16 байт одно прерывание.
и сделайте еще дополнительно поллинг RXFFST, чтобы не оказалось что послано всего два байта и они будут вечно лежать в буфере потому что прерывание только по заполнению всего/половины буфера.

в любом случае даже если прерывание на каждый байт буфер полезен, так как позволяет запретить прерывания на 16 байтов и данные при этом не потеряются.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 27 2016, 18:51
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(_pv @ Sep 27 2016, 23:14) *
таймаут на поллинг RXFFST на приёмнике.
то есть если данных много и идут непрерывно, будет на каждые 8 или 16 байт одно прерывание.
и сделайте еще дополнительно поллинг RXFFST, чтобы не оказалось что послано всего два байта и они будут вечно лежать в буфере потому что прерывание только по заполнению всего/половины буфера.

в любом случае даже если прерывание на каждый байт буфер полезен, так как позволяет запретить прерывания на 16 байтов и данные при этом не потеряются.

так проблема не когда данных много а когда их мало. приходит байт в минуту - какой таймаут выбрать?

если данные заливаются быстро для подстраховки можно настроить прерывание на, скажем 15 байт. если не успел обработать в полинге принял по прерыванию весь буфер.

Сообщение отредактировал Jenya7 - Sep 27 2016, 18:54
Go to the top of the page
 
+Quote Post
mantech
сообщение Sep 27 2016, 20:47
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(Jenya7 @ Sep 27 2016, 21:51) *
так проблема не когда данных много а когда их мало. приходит байт в минуту - какой таймаут выбрать?


Дак зачем тогда паритесь? Ставьте сработку по приему 1 байта и ловите все прерываниями, как в АВРке... Раз байты приходят со скоростью черепахи, к чему все усложнять??
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 28 2016, 07:06
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(mantech @ Sep 28 2016, 01:47) *
Дак зачем тогда паритесь? Ставьте сработку по приему 1 байта и ловите все прерываниями, как в АВРке... Раз байты приходят со скоростью черепахи, к чему все усложнять??

хотелось использовать преимущества буфера. раз уж он есть.

в обычном режиме пользователь набирает команду, скорость небольшая, но при симуляции протокола 1553 у меня идет поток 32 байта каждые 20 милисекунд. там буфер может понадобиться.

Сообщение отредактировал Jenya7 - Sep 28 2016, 07:10
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 28 2016, 07:47
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Jenya7 @ Sep 28 2016, 10:06) *
хотелось использовать преимущества буфера. раз уж он есть.

Можно ещё выпить бутылку водки, стоящую в холодильнике. Раз уж она есть. Но зачем? laughing.gif

Цитата(Jenya7 @ Sep 28 2016, 10:06) *
в обычном режиме пользователь набирает команду, скорость небольшая, но при симуляции протокола 1553 у меня идет поток 32 байта каждые 20 милисекунд. там буфер может понадобиться.

Судя по описанию, точно не понадобится.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Буфер на UART.   Sep 27 2016, 11:52
||- - Сергей Борщ   QUOTE (Jenya7 @ Sep 27 2016, 21:51) прихо...   Sep 27 2016, 19:07
||- - mantech   Цитата(scifi @ Sep 28 2016, 10:47) Можно ...   Sep 28 2016, 15:19
|- - jcxz   Цитата(Jenya7 @ Sep 27 2016, 21:52) буфер...   Sep 27 2016, 16:31
- - mantech   Цитата(Jenya7 @ Sep 27 2016, 14:52) Как в...   Sep 27 2016, 15:01
- - Jenya7   Цитата(mantech @ Sep 27 2016, 20:01) Наст...   Sep 27 2016, 15:11
- - Сергей Борщ   QUOTE (Jenya7 @ Sep 27 2016, 18:11) я не ...   Sep 27 2016, 15:48


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

 


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


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