|
Буфер на UART. |
|
|
|
Sep 27 2016, 12:32
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 27 2016, 15:52
|
Профессионал
    
Группа: Участник
Сообщений: 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 чара?
|
|
|
|
|
Sep 27 2016, 16:41
|
Профессионал
    
Группа: Участник
Сообщений: 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, каналов которого может не хватать. ну это то что нам надо. плюс чары не теряются.
|
|
|
|
|
Sep 27 2016, 18:14
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(Jenya7 @ Sep 27 2016, 23:59)  а как выбрать интервал таймаута? юзер может делать сколь угодно долгие паузы между символами. таймаут на поллинг RXFFST на приёмнике. то есть если данных много и идут непрерывно, будет на каждые 8 или 16 байт одно прерывание. и сделайте еще дополнительно поллинг RXFFST, чтобы не оказалось что послано всего два байта и они будут вечно лежать в буфере потому что прерывание только по заполнению всего/половины буфера. в любом случае даже если прерывание на каждый байт буфер полезен, так как позволяет запретить прерывания на 16 байтов и данные при этом не потеряются.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|