Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-окт-19 20:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: 2018-май-22 11:41 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
Передаю байты с компьютера на демо-плату 1986ВЕ3. Использую приём с FIFO. Обработчик прерывания считывает флаги прерывания приёма и таймаута. В программе принятые данные должны передаваться наружу через Ethernet по заполнению приёмного буфера, либо при возникновении таймаута.
Оказалось, что если послать в плату ровно 16 байт подряд (размер FIFO), то признака таймаута (и прерывания по нему) не возникает, только по приёму. Если посылать меньше или больше, то всё нормально отрабатывает. Это странно, ибо в спецификации написано:
Цитата:
Прерывание по таймауту приемника возникает в случае, если буфер FIFO приемника не пуст, и на вход приемника не поступало новых данных в течение периода времени, необходимого для передачи 32 бит.

Баг?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-22 14:50 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
Кажется я понял, таймаута нет когда превышен порог заполнения fifo. Если он не превышен, то прерывание по таймауту. Если превышен, то прерывание по заполнению fifo.
Тогда этот таймаут UART мне не сгодится, придётся самому отсчитывать паузу в потоке данных. Обидно.

Получается, что это косяк спецификации - алгоритм работы не соответствует описанию в спецификации.
По факту это всего лишь таймаут по заполнению FIFO, а вовсе не
Цитата:
на вход приемника не поступало новых данных


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-22 17:35 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1155
Откуда: Тула
Dimonira писал(а):
Кажется я понял, таймаута нет когда превышен порог заполнения fifo. Если он не превышен, то прерывание по таймауту. Если превышен, то прерывание по заполнению fifo.
Тогда этот таймаут UART мне не сгодится, придётся самому отсчитывать паузу в потоке данных. Обидно.

Получается, что это косяк спецификации - алгоритм работы не соответствует описанию в спецификации.
По факту это всего лишь таймаут по заполнению FIFO, а вовсе не
Цитата:
на вход приемника не поступало новых данных


Вы пробовали оставить обработку ТОЛЬКО прерывания по таймауту?

Во-вторых: всё будет хорошо, если настроить прерывание на заполнение, к примеру, 7/8 буфера и вычитывать из него, скажем 6/8 = 12 байт. Тогда у Вас и переполнения никогда не произойдёт и таймаут гарантированно будет.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-23 08:06 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
prostoRoman писал(а):
Вы пробовали оставить обработку ТОЛЬКО прерывания по таймауту?

Зачем? Это в жизни не годится в любом случае, ибо чаще всего объём данных будет превышать размер FIFO.

prostoRoman писал(а):
Во-вторых: всё будет хорошо, если настроить прерывание на заполнение, к примеру, 7/8 буфера и вычитывать из него, скажем 6/8 = 12 байт. Тогда у Вас и переполнения никогда не произойдёт и таймаут гарантированно будет.

Такой идеи не возникло. Попробую.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-23 08:32 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1155
Откуда: Тула
Dimonira писал(а):
prostoRoman писал(а):
Вы пробовали оставить обработку ТОЛЬКО прерывания по таймауту?

Зачем? Это в жизни не годится в любом случае, ибо чаще всего объём данных будет превышать размер FIFO.

Это я пытаюсь выяснить точно ли не происходит прерывание по таймауту приёма при полном буфере.
Ибо возможна ситуация, что ранее случается прерывание по заполнению фифо, оно (фифо) вычитывается полностью, поэтому и перрывания не происходит. Чистый эксперимент.
Dimonira писал(а):
prostoRoman писал(а):
Во-вторых: всё будет хорошо, если настроить прерывание на заполнение, к примеру, 7/8 буфера и вычитывать из него, скажем 6/8 = 12 байт. Тогда у Вас и переполнения никогда не произойдёт и таймаут гарантированно будет.

Такой идеи не возникло. Попробую.

Обязательно. Для себя в этой схеме вижу единственное работоспособное решение.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-23 10:45 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
prostoRoman писал(а):
Это я пытаюсь выяснить точно ли не происходит прерывание по таймауту приёма при полном буфере.
Ибо возможна ситуация, что ранее случается прерывание по заполнению фифо, оно (фифо) вычитывается полностью, поэтому и перрывания не происходит. Чистый эксперимент.

Дело не в полном буфере, а превышении порога прерывания от FIFO. Если порог превышен, будет прерывание по приёму данных, а не таймауту. При этом, если в обработчике прерывания вычитать весь FIFO, то потом прерывания никакого не возникнет (если новые данные не придут). Это уже проверено.

prostoRoman писал(а):
Обязательно. Для себя в этой схеме вижу единственное работоспособное решение.

Да, это работает. В прерывании по превышению порога читаю из FIFO на одно слово меньше порогового значения (1/3/7/11/13), после чего возникает ещё прерывание по таймауту, в котором вычитываю остаток. Так что спасибо за идею.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-23 14:13 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1155
Откуда: Тула
Dimonira писал(а):
prostoRoman писал(а):
Это я пытаюсь выяснить точно ли не происходит прерывание по таймауту приёма при полном буфере.
Ибо возможна ситуация, что ранее случается прерывание по заполнению фифо, оно (фифо) вычитывается полностью, поэтому и перрывания не происходит. Чистый эксперимент.

Дело не в полном буфере, а превышении порога прерывания от FIFO. Если порог превышен, будет прерывание по приёму данных, а не таймауту. При этом, если в обработчике прерывания вычитать весь FIFO, то потом прерывания никакого не возникнет (если новые данные не придут). Это уже проверено.

Именно это меня и интересовало. И именно это написано в СП. Всё чётко, уже обсуждали.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-24 08:36 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
prostoRoman писал(а):
Именно это меня и интересовало. И именно это написано в СП.

Нет, в СП написано абсолютно не это. Что именно там написано, я приводил в первом посте. Контроллер ведёт себя не так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-24 09:08 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1155
Откуда: Тула
Dimonira писал(а):
prostoRoman писал(а):
Именно это меня и интересовало. И именно это написано в СП.

Нет, в СП написано абсолютно не это. Что именно там написано, я приводил в первом посте. Контроллер ведёт себя не так.

Вот и перечитайте приведённую цитату.

условие возникновения прерывания по таймауту = "буфер не пуст" И "таймаут".
а не "буфер не пуст" ИЛИ "таймаут"

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-24 10:42 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
prostoRoman писал(а):
условие возникновения прерывания по таймауту = "буфер не пуст" И "таймаут".
а не "буфер не пуст" ИЛИ "таймаут"

Вовсе не так. Перечитайте тему. Вот так правильно:
условие возникновения прерывания по таймауту = "буфер не пуст, но при этом заполнен менее порога",
где порог заполнения буфера и его превышение - условие прерывания по приёму в буфер.
А сделано это только для того, чтобы принимать оставшиеся данные (или мало пришло), размер которых меньше порога FIFO. Иначе они бы сидели в буфере до прихода следующих данных пока порог не был бы превышен.

А цитата из СП как раз неправильная, на что я и нарвался.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-24 12:26 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1155
Откуда: Тула
Dimonira писал(а):
prostoRoman писал(а):
условие возникновения прерывания по таймауту = "буфер не пуст" И "таймаут".
а не "буфер не пуст" ИЛИ "таймаут"

Вовсе не так. Перечитайте тему. Вот так правильно:
условие возникновения прерывания по таймауту = "буфер не пуст, но при этом заполнен менее порога",
где порог заполнения буфера и его превышение - условие прерывания по приёму в буфер.
А сделано это только для того, чтобы принимать оставшиеся данные (или мало пришло), размер которых меньше порога FIFO. Иначе они бы сидели в буфере до прихода следующих данных пока порог не был бы превышен.

А цитата из СП как раз неправильная, на что я и нарвался.

Вы не правильно используете/понимаете прерывания.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-май-24 14:41 
Не в сети

Зарегистрирован: 2018-янв-19 07:44
Сообщения: 39
prostoRoman писал(а):
Вы не правильно используете/понимаете прерывания.

Думаете за более чем 30 лет работы так и не научился?
Я вам сказал как есть в реальности, понимайте как хотите.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB