реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы со стеком uip на АРМ, контроллер перестаёт отвечать на пакеты
athlon64
сообщение May 17 2011, 08:25
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Контроллер SAM7X512.
Стек uIp был взят из атмеловского примера веб сервера и скорректирован id под мой PHY KSZ8001. Веб сервер прекрасно работает.
После некоторого времени работы заметил что контроллер перестаёт отвечать на ethernet-пакеты, пинг не идёт, веб-интерфейс не открывается. После сброса (контроллера и PHY) всё нормализуется.
Сам контроллер при этом не зависает, микросхема PHY продолжает мигать светодиодом Link/Act как и при нормальной работе.
Такое проявляется довольно редко, последний раз контроллер проработал нормально 4 суток. Контроллер включен в корпоративную сеть.
В каком направлении копать?

Сообщение отредактировал athlon64 - May 17 2011, 08:27


--------------------
Руслан
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 18 2011, 06:52
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Выловил выдачу сообщения об ошибке.
Контроллер когда перестаёт отвечать в EMAC_Poll выдаёт сообщение
"size req 1488 size allocated 1066"


--------------------
Руслан
Go to the top of the page
 
+Quote Post
XVR
сообщение May 18 2011, 07:05
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Сам контроллер при этом не зависает, микросхема PHY продолжает мигать светодиодом Link/Act как и при нормальной работе.
Это ни о чем не говорит - PHY будет моргать светодиодами даже если его вообще от контролера отключить sm.gif
Цитата
Контроллер когда перестаёт отвечать в EMAC_Poll выдаёт сообщение
"size req 1488 size allocated 1066"
Судя по сообщению у вас в контролере кончился heap. Ищите утечки памяти в своей программе (или в uIp стеке)
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 18 2011, 11:37
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(XVR @ May 18 2011, 13:05) *
Это ни о чем не говорит - PHY будет моргать светодиодами даже если его вообще от контролера отключить sm.gif
Судя по сообщению у вас в контролере кончился heap. Ищите утечки памяти в своей программе (или в uIp стеке)

Не похоже что дело в нехватке heap, стек его не использует насколько я понимаю, по крайней мере я не нашёл.
В моей программе heap не утекает, остальные задачи, использующие heap после вываливания ошибки работают прекрасно.


--------------------
Руслан
Go to the top of the page
 
+Quote Post
XVR
сообщение May 18 2011, 11:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Не похоже что дело в нехватке heap,
Судя по тексту ошибки (уверен на 99%) - ругался malloc. Его попросили выделить 1488 байтов, а в наличии оказалось максимум 1066
Цитата
остальные задачи, использующие heap после вываливания ошибки работают прекрасно.
Видимо остальным задачам оставшихся 1066 байтов хватило
Go to the top of the page
 
+Quote Post
athlon64
сообщение May 19 2011, 08:03
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(XVR @ May 18 2011, 17:52) *
Судя по тексту ошибки (уверен на 99%) - ругался malloc. Его попросили выделить 1488 байтов, а в наличии оказалось максимум 1066
Видимо остальным задачам оставшихся 1066 байтов хватило

1066 это константа UIP_CONF_BUFFER_SIZE в файле uip-conf.h. Пробовал её уменьшать до 256 и задачи спокойно находили более 256 байт динамической памяти с помощью malloc.

А сообщение выводит вот этот кусок функции EMAC_Poll:
Цитата
if ((pRxTd->status & EMAC_RX_EOF_BIT) == EMAC_RX_EOF_BIT)
{
// Frame size from the EMAC
*pRcvSize = (pRxTd->status & EMAC_LENGTH_FRAME);

// Application frame buffer is too small all data have not been copied
if (tmpFrameSize < *pRcvSize)
{
COM0_fprint("size req %d size allocated %d\n\r", *pRcvSize, frameSize);
return EMAC_RX_FRAME_SIZE_TOO_SMALL;
}

// All data have been copied in the application frame buffer => release TD
while (rxTd.idx != tmpIdx)
{
pRxTd = rxTd.td + rxTd.idx;
pRxTd->addr &= ~(EMAC_RX_OWNERSHIP_BIT);
CIRC_INC(rxTd.idx, RX_BUFFERS);
}


попробовал добавить сброс статуса (pRxTd->status = 0;), так хотя бы обмен ethernat-пакетами возобновляется, но какое то некрасивое решение



--------------------
Руслан
Go to the top of the page
 
+Quote Post
XVR
сообщение May 19 2011, 08:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Ага, значит попал в оставшийся 1% - это не malloc sm.gif К вас по Ethernet пришел слишком большой пакет - не влез в приемный буфер sad.gif
Увеличьте UIP_CONF_BUFFER_SIZE до 1488 (если в RAM влезет), а лучше до 1500

Go to the top of the page
 
+Quote Post
athlon64
сообщение May 19 2011, 09:20
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 10-03-10
Из: Уфа
Пользователь №: 55 882



Цитата(XVR @ May 19 2011, 14:25) *
Ага, значит попал в оставшийся 1% - это не malloc sm.gif К вас по Ethernet пришел слишком большой пакет - не влез в приемный буфер sad.gif
Увеличьте UIP_CONF_BUFFER_SIZE до 1488 (если в RAM влезет), а лучше до 1500

Это самое первое что я попробовал, вылезло сообщение о попытке поместить пакет размером 1541 в буфер 1500 sm.gif


--------------------
Руслан
Go to the top of the page
 
+Quote Post
XVR
сообщение May 19 2011, 15:28
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(athlon64 @ May 19 2011, 13:20) *
Это самое первое что я попробовал, вылезло сообщение о попытке поместить пакет размером 1541 в буфер 1500 sm.gif

А вот это уже странно - максимальный размер Ethernet пакета (со всеми заголовками и пр) всего 1518 байтов. Так что 1541 имеет право быть проигнорированным laughing.gif
Go to the top of the page
 
+Quote Post
Nemod
сообщение Jun 1 2012, 12:20
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 23-08-06
Из: Москва
Пользователь №: 19 754



Цитата(athlon64 @ May 17 2011, 11:25) *
Контроллер SAM7X512.
Стек uIp был взят из атмеловского примера веб сервера и скорректирован id под мой PHY KSZ8001. Веб сервер прекрасно работает.
После некоторого времени работы заметил что контроллер перестаёт отвечать на ethernet-пакеты, пинг не идёт, веб-интерфейс не открывается. После сброса (контроллера и PHY) всё нормализуется.
Сам контроллер при этом не зависает, микросхема PHY продолжает мигать светодиодом Link/Act как и при нормальной работе.
Такое проявляется довольно редко, последний раз контроллер проработал нормально 4 суток. Контроллер включен в корпоративную сеть.
В каком направлении копать?


Смотрите бит AT91C_EMAC_BNA,
если такое случилось лучше очистить весь приемный буфер (я обычно просто выкачиваю все пакеты оттуда, recieve пока есть пакеты буфере)
и сбросить этот бит
AT91C_BASE_EMAC->EMAC_RSR |= AT91C_EMAC_BNA;

Остальные приемы которые раньше я делал типа переинициализации периферии не помогали.

Вообще в сетях где много мусора (смотрите снифером wireshark), забивается буфер 16-32 кб довольно быстро (2-4 мс при трафике 60мегабит/с например, 1,5 - 3 мс считая фрагментирование данных по 128 байт).
Если пришел пакет срочно его выгребайте из DMA буфера. 50мгц это очень мало для работы с Ethernet.

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016