Полная версия этой страницы:
самый быстрый сетевой чип ?
Огурцов
Jan 2 2013, 17:41
Помучал(ся) w5200, начинал с 25 пакетов в секунду, сечас разогнал до 5-6 тысяч, случайный максимум 7 тысяч при какой-то там оптимизации. Но это все равно мало в сравнении с максимальной пропускной способностью 100 мегабит (200 тысяч).
Мне нужно раз в десять больше, чем сейчас, т.е. 50-60-70 тысяч в секунду. На каком чипе можно столько (или больше) выжать ? Предпочтительно на SPI, т.к. скорость SPI на скорость передачи не очень сильно влияет.
Не страдайте фигней, возьмите процессор со встроенным MAC.
Огурцов
Jan 2 2013, 20:05
Я бы взял stm32f407, но корпус великоват, да и PHY все равно снаружи ставить.
Более менее эквивалент w5200 - ENC424J600, но после enc28j60 как-то я опасаюсь.
По w5200
Интересно, что при снижении тактовой частоты процессора скорость передачи падает практически один в один.
А при отправке пакета через восемь сокетов сразу в некоторые моменты скорость передачи достигает максимальной. Подключение напрямую, без коммутатора.
Нажмите для просмотра прикрепленного файлаCODE
int16_t _UDPSend(uint8_t s, const uint8_t * buf, uint16_t len, uint8_t * addr, uint16_t port)
{
uint8_t status=0;
uint16_t ret=0;
if (((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && (addr[3] == 0x00)) || ((port == 0x00)))
return 0;
status = getSn_SR(s);
if(status == SOCK_CLOSED)
return ERROR_CLOSED;
if((IINCHIP_READ(Sn_MR(s))&0x0F) != Sn_MR_UDP)
return ERROR_NOT_UDP_SOCKET;
if(status != SOCK_UDP)
return ERROR_NOT_UDP_SOCKET;
//-----------------------
/* wait to process the command... */
while(IINCHIP_READ(Sn_CR(s)));
while (sending[s] && ((IINCHIP_READ(Sn_IR(s)) & Sn_IR_SEND_OK) != Sn_IR_SEND_OK))
{
if (IINCHIP_READ(Sn_IR(s)) & Sn_IR_TIMEOUT)
{
/* clear interrupt */
IINCHIP_WRITE(Sn_IR(s), (Sn_IR_SEND_OK | Sn_IR_TIMEOUT)); /* clear SEND_OK & TIMEOUT */
sending[s] = 0;
return ERROR_TIME_OUT;
}
}
IINCHIP_WRITE(Sn_IR(s), Sn_IR_SEND_OK);
sending[s] = 0;
ClearSubnet(); // for errata
//------------------
if (len > getIINCHIP_TxMAX(s))
ret = getIINCHIP_TxMAX(s); // check size not to exceed MAX size.
else
ret = len;
IINCHIP_WRITE(Sn_DIPR0(s),addr[0]);
IINCHIP_WRITE((Sn_DIPR0(s) + 1),addr[1]);
IINCHIP_WRITE((Sn_DIPR0(s) + 2),addr[2]);
IINCHIP_WRITE((Sn_DIPR0(s) + 3),addr[3]);
IINCHIP_WRITE(Sn_DPORT0(s),(uint8_t)((port & 0xff00) >> 8));
IINCHIP_WRITE((Sn_DPORT0(s) + 1),(uint8_t)(port & 0x00ff));
// copy data
send_data_processing(s, (uint8_t *)buf, ret);
SetSubnet(Subnet); // for errata
IINCHIP_WRITE(Sn_CR(s),Sn_CR_SEND);
sending[s] = 1;
return ret;
}
Cosmojam
Jan 3 2013, 22:40
На STM32F4 свет клином не сошёлся. Есть STM32F2 и LPC17 в до <= 100 ножных корпусах, а так же LM3S со встроенным PHY
http://www.ti.com/mcu/docs/mculuminaryfeat...amp;featureId=7
Огурцов
Jan 4 2013, 05:00
Не хотелось бы на новых камнях год-другой потерять.
Килопакетов в секунду
F100
2,25
F303
6,13 видимо, за счет наличия буфера SPI
F407
3,67 168мгц - ST обещала, что будет без тактов ожидания, а получилось медленнее, чем на F303 (
5,19 -O3
5,81 передача/прием в одной процедуре
7,50 оптимизация цикла ожидания готовности передатчика
8,66 оптимизация цикла ожидания готовности приемника
8,66 оптимизация условия у циклов
10,62 оптимизация передачи
17,96 оптимизация приема
12,59 inline
12,65 снова без inline
12,90 оптимизация параметров у SPI1_SendByte
11,81 -Os
12,38 -O1
12,17 -O2
QUOTE
Не хотелось бы на новых камнях год-другой потерять.
Это каким таким образом?
Ну а остальное не выдерживает никакой критики - на LPC1768 (всего 100МГц, кстати) достигается без особого гемороя полная утилизация полосы 100М, причем с использованием TCP
и при загрузке проца 40 процентов.
Огурцов
Jan 4 2013, 10:48
Цитата(Rst7 @ Jan 4 2013, 08:35)

Это каким таким образом?
Ну вот такой вот я тормоз. Плюс сюда нужно будет залить денег за среду, программатор, отладочную плату. Проще уж на самом деле к F407 PHY прикрутить.
Цитата(Rst7 @ Jan 4 2013, 08:35)

LPC1768
LPC17 Ride7 кстати может. Но stm32f мне пока нравится.
Просьба: если уж предлагаете вместо сетевого контроллера взять совершенно другой процык, то учитывайте, что я существенно ограничен размерами платы, расчитываю на пару 48ми-ногих или один 64-ногий. LQFP/0.5мм. w5200 в этом смысле - большое зло.
В общем, мысли пока такие
1. Как-то заставить выполняться код или функцию передачи из ОЗУ
2. Прикрутить DMA
3. ...все пока
Огурцов
Jan 4 2013, 13:59
Каким-то непонятным образом после перекомпиляции скорость поднялась до 35.38К. При этом первые полсотни пакетов уходят с максимальной скоростью 200К. Что-то с компилятором/оптимизацией...
Огурцов
Jan 4 2013, 16:11
О! это возможно из-за компиляции релиза
Огурцов
Jan 4 2013, 21:05
В общем, не знаю как 38, но 27К достигается стабильно. При этом уже чувствуется, что SPI поджимает, при снижении тактовой SPI в два раза скорость передачи падает раза в полтора.
Огурцов
Jan 5 2013, 00:28
Может кто-нибудь объяснить, почему эстээмовский SPI клинит, если только отправлять данные и не вычитывать принятые данные каждый раз после отправки ? Типо фича такая или все же руки ?
Хочется убрать третью и четвертую строчки кода:
Код
void SPI1_SendByte(uint8_t aData)
{
while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
SPI1->DR = aData;
while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
(uint8_t)SPI1->DR;
}
Вместе работает, если оставить только первую и вторую, то при приеме считываются одни нули.
Прием:
Код
uint8_t SPI1_ReciveByte()
{
while ((SPI1->SR & SPI_I2S_FLAG_RXNE))
SPI1->DR;
while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
SPI1->DR = (uint8_t)0;
while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
return SPI1->DR;
}
Огурцов
Jan 5 2013, 01:50
Посмотрел ENC424J600 - похоже, что он не подойдет, т.к. SPI 14мгц всего, что даже в идеальном варианте даст всего 27К.
Огурцов
Jan 5 2013, 03:32
Цитата(Cosmojam @ Jan 3 2013, 23:40)

LM3S со встроенным PHY
Был не прав, оказывается ride7 его может, а это среда, прошивка и отладка. Так что вопрос лишь за демобордой.
Цитата(Огурцов @ Jan 5 2013, 05:50)

Посмотрел ENC424J600 - похоже, что он не подойдет, т.к. SPI 14мгц всего, что даже в идеальном варианте даст всего 27К.
ksz8851snl - там spi до 50 мгц...
Cosmojam
Jan 5 2013, 10:10
Цитата(Огурцов @ Jan 5 2013, 06:32)

Был не прав, оказывается ride7 его может, а это среда, прошивка и отладка. Так что вопрос лишь за демобордой.
Судя по видео
http://www.youtube.com/watch?feature=playe...;v=tVTh7E5kSpE#! у них в ближайших планах выпустить LM4F29x серию со встроенным MAC+PHY. Должно быть весьма вкусно.
Огурцов
Jan 5 2013, 13:02
Так оно и сейчас уже очень даже вкусно. Только почему-то все производители просто считают своим долгом засунуть эзернет в стоногий корпус, куда блин с такой плюшкой. БГА был бы поменьше, конечно, но это вообще космос.
Цитата(Огурцов @ Jan 5 2013, 00:28)

Может кто-нибудь объяснить, почему эстээмовский SPI клинит, если только отправлять данные и не вычитывать принятые данные каждый раз после отправки ?
Подумал. Если второй SPI включить слейвом параллельно, то можно будет через один SPI передавать, через другой принимать. Возможно, поможет.
Огурцов
Jan 5 2013, 14:37
Проверил SPI - работает адекватно. Проблема, похоже в w5200 - м.б. не успевает принимать (или отправлять) данные и хочет паузу между ними. Будете смеяться, вот такая шняга работает.
CODE
void SPI1_SendByte(uint8_t byte)
{
// while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
SPI1->DR = byte;
while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
// Delay_us(1);
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
// (uint8_t)SPI1->DR;
}
Если при отправке ждать готовности передатчика, а не приемника - не работает. Если нопов четырнадцать, а не пятнадцать - не работает. Скорость передачи поднялась стабильно до 38К+ Шаманство и магия какие-то, а не программирование.
Огурцов
Jan 5 2013, 16:38
Выше наврал, с w5200 все ок - проверял пошагово в отладчике, а там конечно задержки.
Очевидно, баг в STM.
Примерно вот такой код для проверки, MISO подключен к MOSI
CODE
uint8_t i;
for(i = 11; i < 14; i++)
{
while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
SPI1->DR = i;
Delay_us(1);
}
while ((SPI1->SR & SPI_I2S_FLAG_RXNE))
i = SPI1->DR;
while (!(SPI1->SR & SPI_I2S_FLAG_TXE));
SPI1->DR = (uint8_t)123;
while (!(SPI1->SR & SPI_I2S_FLAG_RXNE));
if (SPI1->DR != (uint8_t)123)
STM_EVAL_LEDOn(LED5);
Задержка после отправки зависит не от времени, а должна быть пропорциональна тактовой частоте-1 SPI, иначе зажигается LED5 (считывается ноль)
STM32F407
VGT6 A
HPAEX VG
KOR HP 123
Поскольку стала понятна причина, добавил ядру частоты до 216MHz и 7 тактов ожидания - теперь летит 48K+ пакетов. Почти сколько нужно.
Огурцов
Jan 6 2013, 14:22
Дрыганьем ножек вручную (без SPI) удалось достичь 19.6К, незнание ассемблера ARM не позволяет оптимизировать код дальше
На 72MHz тактовой, с 2 тактами ожидания, PCLK2==Div1 10 нопов с SPI - 23,2К
зы: 100 пиновый LQFP на первый взгляд не входит. Кто-нить паяет БГА вручную, есть проблемы ?
Огурцов
Jan 7 2013, 04:07
Цитата(Cosmojam @ Jan 3 2013, 23:40)

LM3S со встроенным PHY
Вся линейка ушла в NRND
http://e2e.ti.com/search/default.aspx#q=Lm...0&pi24906=1
Огурцов
Jan 7 2013, 19:01
Таки запустил код в RAMе, скорость почему-то? стала меньше, чем из флеша, и самое необъяснимое, FLASH_SetLatency, почему-то, влияет на выполнение, на 168MHz требует три дополнительных цикла ожидания иначе виснет. Получается, что скорость RAM тоже ограничена, на 3+1 такта, вместо 7+1 для флеша. Если я прав, то получается, что STM32F4 - чисто маркетинговая разводка.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.