jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 (изменено) · Жалоба Раньше все было просто - принял чар, отправил чар. Но сейчас работаю с TMS320F28335. У этого контроллера есть буфер на прием и посылку. И я здумался как его лучше использовать. У него есть обычные прерывания приема/посылки и есть прерывания уровня наполнения буфера. Но я не хочу использовать прерывания буфера так как не знаю сколько чаров получу. Как вообще лучше использовать буфер? Изменено 20 декабря, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 30 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба Раньше все было просто - принял чар, отправил чар. Но сейчас работаю с TMS320F28335. У этого контроллера есть буфер на прием и посылку. И я здумался как его лучше использовать. У него есть обычные прерывания приема/посылки и есть прерывания уровня наполнения буфера. Но я не хочу использовать прерывания буфера так как не знаю сколько чаров получу. Как вообще лучше использовать буфер? Вы 16550 в персональном компьютере использовали? Вот и здесь так же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 (изменено) · Жалоба Вы 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; } } но тогда польза от буфера никакая. Изменено 27 сентября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 34 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба Как вообще лучше использовать буфер? Настраиваете либо кол-во принимаемых символов и прерывание по загрузке оных, либо по таймауту и тогда выгружаете из буфера то, что успело прийти за установленное время. Больше никак Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба Настраиваете либо кол-во принимаемых символов и прерывание по загрузке оных, либо по таймауту и тогда выгружаете из буфера то, что успело прийти за установленное время. Больше никак я не знаю пакет какой длины мне придет и я не знаю когда он придет. а если так - проверять RXRDY полингом? Глубина FIFO 16 байт, опасности потерять чар никакой. и можно не мучать CPU лишними прерываниями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба на обычном прерывании мог бы сделать так. но тогда польза от буфера никакая. польза от буфера такая, что если данных много идёт, можно не на каждый байт дергаться, а в шеснадцать раз реже. и забирать из уарта по несколько байт сразу. ну и чтобы пару байт не висели долго пока буфер не заполнится, можно периодически SciaRegs.SCIFFRX.bit.RXFFST поллить, когда делать больше нечего. но если надо на каждый отдельный байт уметь быстро среагировать, тогда да, поставте просто прерывание по заполнению буфера на 1 байт и дергайтесь по каждому байту. от буфера пользы тогда действительно никакой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба я не знаю пакет какой длины мне придет и я не знаю когда он придет.А UART тем более телепатией не обладает. Настраивайте таймаут в UART на некоторый допустимый межбайтовый интервал и ждете либо прерывания по этому таймауту, либо прерывания по заполнению (половины) буфера. По любому из этих прерываний разгребаете все, что пришло и делаете вывод - ждать следующей порции данных или уже принят весь пакет. Примерно так. Тогда задержка реакции у вас будет равна этому таймауту. Если нужно реагировать сразу - то как написал _pv - прерывание по заполнению буфера на 1 байт и пока вы разгребаете этот байт или делаете что-то еще в другом обработчике - возможные следующие байты не потеряются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба польза от буфера такая, что если данных много идёт, можно не на каждый байт дергаться, а в шеснадцать раз реже. и забирать из уарта по несколько байт сразу. ну и чтобы пару байт не висели долго пока буфер не заполнится, можно периодически SciaRegs.SCIFFRX.bit.RXFFST поллить, когда делать больше нечего. но если надо на каждый отдельный байт уметь быстро среагировать, тогда да, поставте просто прерывание по заполнению буфера на 1 байт и дергайтесь по каждому байту. от буфера пользы тогда действительно никакой. О! Вот я и говорю - проверять RXRDY=1 полингом или RXFFST>0. мне не нужно немедленно реагировать у юарта приоритет низкий, может и подождать. буфер дает уверенность в завтрашнем дне. я правильно понимаю? А UART тем более телепатией не обладает. Настраивайте таймаут в UART на некоторый допустимый межбайтовый интервал и ждете либо прерывания по этому таймауту, либо прерывания по заполнению (половины) буфера. По любому из этих прерываний разгребаете все, что пришло и делаете вывод - ждать следующей порции данных или уже принят весь пакет. Примерно так. а что такое половина буфера? а если придет 4 чара? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба а что такое половина буфера? а если придет 4 чара?Если у вас буфер на 16 байт, поставьте прерывание на прием 8. Пока вы отреагируете на этот запрос прерывания и будете их обрабатывать, у вас будет запас по времени на прием еще 8. Когда примутся эти вторые 8 - вы уже успеете освободить место от первых восьми и у вас в буфере снова будет свободное место когда вы приступите к обработке второй половины. А если придет 4 символа из 8 - вы получите прерывание УАПП по таймауту и в его обработчике сможете обработать эти 4. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба буфер дает уверенность в завтрашнем дне. я правильно понимаю? Нет. Любая буферизация даёт уменьшение загрузки CPU на обслуживание периферии или возможность монопольно занять CPU на большее время (запретив прерывания). Не используя при этом DMA, каналов которого может не хватать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба Если у вас буфер на 16 байт, поставьте прерывание на прием 8. Пока вы отреагируете на этот запрос прерывания и будете их обрабатывать, у вас будет запас по времени на прием еще 8. Когда примутся эти вторые 8 - вы уже успеете освободить место от первых восьми и у вас в буфере снова будет свободное место когда вы приступите к обработке второй половины. А если придет 4 символа из 8 - вы получите прерывание УАПП по таймауту и в его обработчике сможете обработать эти 4. юзер послал команду на 4 чара и пошел кофе пить. мне придется ждать когда он пошлет мне следующую команду. Нет. Любая буферизация даёт уменьшение загрузки CPU на обслуживание периферии или возможность монопольно занять CPU на большее время (запретив прерывания). Не используя при этом DMA, каналов которого может не хватать. ну это то что нам надо. плюс чары не теряются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба юзер послал команду на 4 чара и пошел кофе пить. мне придется ждать когда он пошлет мне следующую команду. Прочитайте все же последнее предложение из сообщения Сергея. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба Прочитайте все же последнее предложение из сообщения Сергея. а как выбрать интервал таймаута? юзер может делать сколь угодно долгие паузы между символами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 27 сентября, 2016 Опубликовано 27 сентября, 2016 · Жалоба а как выбрать интервал таймаута? юзер может делать сколь угодно долгие паузы между символами. таймаут на поллинг RXFFST на приёмнике. то есть если данных много и идут непрерывно, будет на каждые 8 или 16 байт одно прерывание. и сделайте еще дополнительно поллинг RXFFST, чтобы не оказалось что послано всего два байта и они будут вечно лежать в буфере потому что прерывание только по заполнению всего/половины буфера. в любом случае даже если прерывание на каждый байт буфер полезен, так как позволяет запретить прерывания на 16 байтов и данные при этом не потеряются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 27 сентября, 2016 Опубликовано 27 сентября, 2016 (изменено) · Жалоба таймаут на поллинг RXFFST на приёмнике. то есть если данных много и идут непрерывно, будет на каждые 8 или 16 байт одно прерывание. и сделайте еще дополнительно поллинг RXFFST, чтобы не оказалось что послано всего два байта и они будут вечно лежать в буфере потому что прерывание только по заполнению всего/половины буфера. в любом случае даже если прерывание на каждый байт буфер полезен, так как позволяет запретить прерывания на 16 байтов и данные при этом не потеряются. так проблема не когда данных много а когда их мало. приходит байт в минуту - какой таймаут выбрать? если данные заливаются быстро для подстраховки можно настроить прерывание на, скажем 15 байт. если не успел обработать в полинге принял по прерыванию весь буфер. Изменено 27 сентября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться