|
Интересное поведение EMAC на LPC17xx |
|
|
|
Jun 15 2011, 11:40
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Очень занятное поведение флага INTSTATUS_bit.RXDONEINT обнаружилось. Разрешено только прерывания RXDONEINT. Там такой код: CODE void Ethernet_IRQHandler(void) { UREG i='0'; do { INTCLEAR=1UL<<3; //RxDoneInt i++; } while(INTSTATUS_bit.RXDONEINT); usart0_txc(i); NVIC_ClrPend(NVIC_ETHR); NVIC_SetPend(NVIC_RIT); //Ñòàðòóåì RIT_IRQHandler } Неспеша кормлю девайсу по одному пакету (дабы быть уверенным, что никакого переполнения не происходит). В результате в консоль сыпется: CODE 122212112121121112122222222112112211212222222121111.... Пуристы для тестов могут заменить usart0_txc на ногодрыг и наблюдать осциллографом тот же результат - импульсов то 1, то 2. Если бы просто сделать CODE void Ethernet_IRQHandler(void) { INTCLEAR=1UL<<3; //RxDoneInt NVIC_ClrPend(NVIC_ETHR); NVIC_SetPend(NVIC_RIT); //Ñòàðòóåì RIT_IRQHandler } то этот код часто (а то и вообще всегда) вызывается 2 раза - не сбрасывается флаг RxDoneInt, соответственно, сброс соответствующего бита в NVIC не помогает - не снят изначальный флаг, т.е. происходит опять поднятие флага в NVIC и последующее прерывание. Правда, на второй заход сброс таки происходит. Вот такой код вроде (ну ибо на обозримом отрезке времени мне не удалось наблюдать двойной вызов) всегда вызывается один раз: CODE void Ethernet_IRQHandler(void) { INTSTATUS; __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); INTCLEAR=1UL<<3;//RxDoneInt NVIC_ClrPend(NVIC_ETHR); NVIC_SetPend(NVIC_RIT); //Ñòàðòóåì RIT_IRQHandler } Ересь какая-то в общем. Другие биты не проверял. Есть у кого какие мысли? В общем-то такое поведение и не особо страшно, но уж очень стремно
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jun 15 2011, 12:41
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Мне кажется что у него какой-то внутренний сигнал, устанавливающий запрос RXDONEINT не успевает сняться. Да вот там есть интересная фраза такая в мане, что QUOTE Note that all bits are flip-flops with an asynchronous set in order to be able to generate interrupts if there are wake-up events while clocks are disabled. Какими они там сигналами асинхронно выставляются, я уж хз. Запросто эти сигналы могут быть заведены на вход S триггеров и быть по длительности хз какими. Вот и не сбрасывается. QUOTE У меня в прерывании с регистрами EMAC ничего не делается - просто ставится событие RTOS Так тут тоже самое. NVIC_SetPend(NVIC_RIT) - это и есть запуск потока обработки. Только у него приоритет ниже, посему начинает обрабатывать позже.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jun 15 2011, 13:46
|
Частый гость
 
Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355

|
Цитата while(INTSTATUS_bit.RXDONEINT); Посмотрите соответствующий код в ассемблере, нет ли там записи в INTSTATUS. У меня были какие-то неприятности с прерываниями от ЕМАС, когда я делал так: Код if (LPC_EMAC->IntStatus & (1 << INT_RX_DONE)) давненько было - не помню подробностей. Сделал так: Код unsigned int temp = LPC_EMAC->IntStatus; if (temp & INT_RX_DONE) { LPC_EMAC->IntClear = INT_RX_DONE; } И неприятностей больше не было.
|
|
|
|
|
Jun 15 2011, 14:04
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE А если dsb вставить после записи INTCLEAR? Барьеры не помогают (только как задержка вместо нопов). Я тоже сразу подумал о синхронизации всяких Load-Store конвейеров, но это не оно. QUOTE Я правильно понял - происходит двойной заход в обработчик? Не двойной заход. Вход-выход и опять вход-выход. На втором входе все замечательно очищается. CODE void Ethernet_IRQHandler(void) { INTCLEAR=1UL<<3;//RxDoneInt NVIC_ClrPend(NVIC_ETHR); ...тут например дрыгаем ножкой для теста } Такой код дрыгает ножкой два раза на один пакет. Без паузы. QUOTE Посмотрите соответствующий код в ассемблере, нет ли там записи в INTSTATUS. Конечно нет. Код корректный.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jun 15 2011, 14:13
|

embarrassed systems engineer
    
Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038

|
Цитата(Rst7 @ Jun 15 2011, 15:41)  Так тут тоже самое. NVIC_SetPend(NVIC_RIT) - это и есть запуск потока обработки. Только у него приоритет ниже, посему начинает обрабатывать позже. Не совсем то же самое - Вы цупите INTCLEAR. Я прерывания от EMAC запрещаю через NVIC: Код void lw_lpc17_emac_handler( void) { tn_event_iset(&glw_lpc17_netif->event, MACEVT_MACIRQ); NVIC_IDCR0 = (1<<IRQ_EMAC); } Разбор чего там EMAC захотел и общение с его регистрами происходит позже в потоке
|
|
|
|
|
Jun 16 2011, 04:29
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Rst7 @ Jun 15 2011, 15:40)  Код void Ethernet_IRQHandler(void) { UREG i='0'; do { INTCLEAR=1UL<<3; //RxDoneInt i++; } while(INTSTATUS_bit.RXDONEINT); usart0_txc(i); NVIC_ClrPend(NVIC_ETHR); NVIC_SetPend(NVIC_RIT); //Ñòàðòóåì RIT_IRQHandler } Код void Ethernet_IRQHandler(void) { INTSTATUS; __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); INTCLEAR=1UL<<3;//RxDoneInt NVIC_ClrPend(NVIC_ETHR); NVIC_SetPend(NVIC_RIT); //Ñòàðòóåì RIT_IRQHandler } Я с EMAC плотно пока не работал, поэтому есть лишь догадка: в первом случае INTSTATUS вычитывается ПОСЛЕ первого обнуления в INTCLEAR, а во втором СНАЧАЛА читается статус, потом очищается прерывание. Может быть тот самый упомянутый выше "спусковой крючок" находится в INTSTATUS и сначала надо его прочитать (как в некоторых self-clear прерываниях), а потом уже принудительно прописать бит в INTCLEAR?
|
|
|
|
|
Jun 16 2011, 05:56
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE поэтому есть лишь догадка Я так тоже думал. Нет, просто паузы достаточно для последующей нормальной очистки флага. QUOTE Я в LPC1768 не смог победить их работу с прерыванием RxDone. А что его побеждать? Оно работает. QUOTE Да, а заметили, что первые пара пакетов шлётся криво? В Errata описан такой баг. Хватило квалификации не наступить. Ибо изначально изучил Errata и закодил передачу пары пакетов заранее. И вообще, описанный баг превращается в фичу
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Jun 17 2011, 04:22
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Цитата А что его побеждать? Оно работает. А у меня не работает. Киньте что ли сюда код обработки прерывания - уберу у себя поллинг.
|
|
|
|
|
Jul 21 2011, 13:30
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 20-06-11
Из: Ленино
Пользователь №: 65 788

|
Люди, а каких вы скоростей на Lpc17 достигаете по tcp?
|
|
|
|
|
Jul 21 2011, 14:37
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
QUOTE Люди, а каких вы скоростей на Lpc17 достигаете по tcp? Смотря какую полезную нагрузку вкладывать. В принципе, при верном подходе утилизируется вся доступная полоса. Да, кстати, собственно по теме топика. Оказывается, у меня не была припаяна ножка RX- на PHY - работало по одному проводу. В результате после окончания пакета на 10МБит были еще дрыгания, которые интерпретировались PHY как начало нового фрейма. А MAC, как оказалось, даже такой в упор непакет все таки отбрасывает с установкой флага прерывания. В общем, имейте в виду, что может происходить и такая ересь.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|