|
|
  |
Непонимание работы ядра Ethernet, c opencores, поясните пжл. |
|
|
|
Dec 22 2012, 08:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Сконфигурировал ядро (то, которое с авалон-мм) для работы с одним дескриптором на передачу и одним на прием. Ставлю брейкпоинт на обработку прерывания по приему. Посылаю пинг с компа. Срабатывает брейк, жду. Проходят 4 пинга, при этом программа висит на брейке. Дальше нажимаю run - и тут же выскакивает (после обработки первого пинга) брейк от второго (затем от 3-го и 4-го), а пинги то уже прошли!
Вопросы такие, поясните кто с этим дело имел:
1. Один дескриптор обрабатывает 1 фрейм эзернета или несколько? 2. Почему срабатывают прерывания по приему, когда пинги уже прошли? И именно столько раз, сколько было пингов? 3. Если дескриптор обрабатывает 1 фрейм - непонятно, где копятся остальные пинги пока программа висит в брейке? 4. Если дескриптор обрабатывает скольугодно фреймов (пишет все что приходит с эзернета подряд) - как ограничить железяке место, куда она может писать? Ато ведь кончится отведенное ей место - залезет на область данных или программы и будет ситуация ж..па.
PS даже если 4. верно, непонятно почему срабатывают прерывания после того как пинги прошли.
Буду рад любым пояснениям.
|
|
|
|
|
Jan 17 2013, 16:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Еще вопрос, если можно:
Когда стою в брейкпоинте, а на порт приходят пакеты, то после брейка запускаю выполнение, то что было в фифо(видимо) еще вызывает прерывания, а потом прерывания по приему перестают вызываться. Отправка пакетов при этом работает. То есть видимо когда корковое фифо переполняется (если например тормознуть программу и не обрабатывать пакетов 5-10), то потом прием пакетов (в частности прерывание по приему) не работает. Подозреваю, что если будет много пакетов в сети, то ситуация повторится - фифо переполнится (проц не успеет например обработать заголовки) и прием заткнется. Как то можно это вылечить? Ну например пусть пакеты пропадут, но когда приходит очередной - прерывание все таки чтобы срабатывало?
|
|
|
|
|
Jan 17 2013, 17:05
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 23-12-12
Пользователь №: 74 946

|
Цитата(alexPec @ Jan 17 2013, 20:09)  Еще вопрос, если можно:
Подозреваю, что если будет много пакетов в сети, то ситуация повторится - фифо переполнится (проц не успеет например обработать заголовки) и прием заткнется. Как то можно это вылечить? Ну например пусть пакеты пропадут, но когда приходит очередной - прерывание все таки чтобы срабатывало? Не знаю как у вас, а ксилинксовое ядро TEMAC после переполнения fifo надо обязательно сбросить. В вашем ядре есть прерывание типа Receive FIFO Overrun?
|
|
|
|
|
Jan 18 2013, 06:54
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(vadimuzzz @ Jan 18 2013, 05:37)  хм, хороший вопрос! в документации на корку говорится, что для предотвращения переполнения fifo используется флаг almost_full (конфигурируется через соответствующий регистр). если во время приема фрейма обнаружится, что пакет в буфер не влезает (т.е. сработал флаг almost_full), то фрейм обрезается и его дескриптор соответствующим образом помечается. в статусе дескриптора принятого пакета за переполнение отвечает третий бит
а вот что происходит дальше - непонятно, в доках об этом не говорится. сброс корки, пожалуй, самое правильное решение. но я бы посмотрел в сигналтапе сигналы fifo (можно синзронизироваться по almost_full) и как себя ведет корка. есть еще вариант, что неверно настроен регистр rx_almost_full. PAUSE-фреймы тоже нормальный вариант. Спасибо, поле деятельности есть. Буду пробовать.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|