Перейти к содержанию
    

самый быстрый сетевой чип ?

Помучал(ся) w5200, начинал с 25 пакетов в секунду, сечас разогнал до 5-6 тысяч, случайный максимум 7 тысяч при какой-то там оптимизации. Но это все равно мало в сравнении с максимальной пропускной способностью 100 мегабит (200 тысяч).

Мне нужно раз в десять больше, чем сейчас, т.е. 50-60-70 тысяч в секунду. На каком чипе можно столько (или больше) выжать ? Предпочтительно на SPI, т.к. скорость SPI на скорость передачи не очень сильно влияет.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы взял stm32f407, но корпус великоват, да и PHY все равно снаружи ставить.

Более менее эквивалент w5200 - ENC424J600, но после enc28j60 как-то я опасаюсь.

 

По w5200

Интересно, что при снижении тактовой частоты процессора скорость передачи падает практически один в один.

А при отправке пакета через восемь сокетов сразу в некоторые моменты скорость передачи достигает максимальной. Подключение напрямую, без коммутатора.

 

post-26588-1357156966_thumb.jpg

 

 

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;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На STM32F4 свет клином не сошёлся. Есть STM32F2 и LPC17 в до <= 100 ножных корпусах, а так же LM3S со встроенным PHY http://www.ti.com/mcu/docs/mculuminaryfeat...amp;featureId=7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хотелось бы на новых камнях год-другой потерять.

 

Килопакетов в секунду

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хотелось бы на новых камнях год-другой потерять.

 

Это каким таким образом?

 

Ну а остальное не выдерживает никакой критики - на LPC1768 (всего 100МГц, кстати) достигается без особого гемороя полная утилизация полосы 100М, причем с использованием TCP

и при загрузке проца 40 процентов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это каким таким образом?

 

Ну вот такой вот я тормоз. Плюс сюда нужно будет залить денег за среду, программатор, отладочную плату. Проще уж на самом деле к F407 PHY прикрутить.

 

LPC1768

LPC17 Ride7 кстати может. Но stm32f мне пока нравится.

Просьба: если уж предлагаете вместо сетевого контроллера взять совершенно другой процык, то учитывайте, что я существенно ограничен размерами платы, расчитываю на пару 48ми-ногих или один 64-ногий. LQFP/0.5мм. w5200 в этом смысле - большое зло.

 

 

В общем, мысли пока такие

 

1. Как-то заставить выполняться код или функцию передачи из ОЗУ

2. Прикрутить DMA

3. ...все пока

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каким-то непонятным образом после перекомпиляции скорость поднялась до 35.38К. При этом первые полсотни пакетов уходят с максимальной скоростью 200К. Что-то с компилятором/оптимизацией...

Изменено пользователем Огурцов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, не знаю как 38, но 27К достигается стабильно. При этом уже чувствуется, что SPI поджимает, при снижении тактовой SPI в два раза скорость передачи падает раза в полтора.

Изменено пользователем Огурцов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто-нибудь объяснить, почему эстээмовский 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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел ENC424J600 - похоже, что он не подойдет, т.к. SPI 14мгц всего, что даже в идеальном варианте даст всего 27К.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

LM3S со встроенным PHY

Был не прав, оказывается ride7 его может, а это среда, прошивка и отладка. Так что вопрос лишь за демобордой.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел ENC424J600 - похоже, что он не подойдет, т.к. SPI 14мгц всего, что даже в идеальном варианте даст всего 27К.

ksz8851snl - там spi до 50 мгц...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Был не прав, оказывается ride7 его может, а это среда, прошивка и отладка. Так что вопрос лишь за демобордой.

Судя по видео http://www.youtube.com/watch?feature=playe...;v=tVTh7E5kSpE#! у них в ближайших планах выпустить LM4F29x серию со встроенным MAC+PHY. Должно быть весьма вкусно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...