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

 
 
> Проблемы со стеком 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
 
Start new topic
Ответов
XVR
сообщение May 18 2011, 11:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


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

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:29
Рейтинг@Mail.ru


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