|
Преобразование данных Ethernet в потоки E1 |
|
|
|
Mar 7 2011, 19:06
|
Группа: Новичок
Сообщений: 3
Регистрация: 7-03-11
Пользователь №: 63 454

|
В процессе выполнения работы возникла серьезная проблема. Мне нужно запрограммировать ПЛИС так, чтобы она преобразовывала данные, пришедшие по каналу Ethernet в однобитный поток E1. Скорость передачи данных по Ethernet больше, чем по E1, поэтому использую следующую схему: компьютер посылает на ПЛИС N-ое количество пакетов, ПЛИС загоняет их в буфер и начинает передавать по каналу E1. Как только буфер освобождается до определенного уровня, ПЛИС посылает компьютеру запрос, мол я освобождаюсь, давай еще данные, и компьютер шлет еще. Важно чтобы буфер при этом не освобождался и не переполнялся, потому что данные в потоке Е1 должны идти непрерывно и последовательно. Так вот, проблема в том что буфер, скотина этакая, несмотря на размер в 100 Кб все же как-то умудряется освобождаться!!! То есть посылка данных на какое-то время прерывается и за это время буфер успевает освободиться. Парюсь с этим говном уже месяц. Люди если есть какие мысли, подскажите пожалуйста, с чем это может быть связано и как с этим бороться? Конфигурация следующая: ПЛИС Xilinx XC4VLX20, скорость Ethernet около 10 Мбайт/с, скорость Е1 2 Мбайта/с, данные передаются по UDP, ОС на компе Windows XP, программа для передачи данных написана на C#, комп имеет на борту Core2Duo E8400 3ГГц, 4 Гига DDR2-800 и жесткий диск гигов на 200. Буфер представляет собой FIFO, сгенерированное при помощи Xilinx Core Generator.
|
|
|
|
|
Mar 7 2011, 19:32
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата скорость Е1 2 Мбайта/с Странный у Вас Е1. Раз в 8 быстрее, чем у всех остальных...  Цитата программа для передачи данных написана на C# Как-то была история - притаскиваю (на другой конец области) программистам железку, подключаемую к компу через Езернет и тестовую программу, написанную на C Builder. Включаем, запускаем прогу - всё работает. Уезжаю. Через 2 недели звонок - приезжай, не работает твоя железка. Приезжаю (на другой конец области), показывают мне свою красивую программу, написанную на C#, запускают - не работает. Достаю ноут, подключаю, запускаю свою тестовую программу - работает. В общем, ихняя красивая программа на C# работала таааааааааак медленно, что поток информации просто не успевала принимать.
|
|
|
|
|
Mar 7 2011, 19:46
|
Знающий
   
Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219

|
Цитата(Koluchiy @ Mar 7 2011, 22:32)  ... В общем, ихняя красивая программа на C# работала таааааааааак медленно, что поток информации просто не успевала принимать. Я тоже как-то принимал большой поток данных по 1G Ethernet. Даже использование С++ Builder'а с вызовом WinAPI Sokeтов не сильно помогало, пока не применил библиотеку WinPCAP - потери пакетов сразу прекратились. А в C# гемморой с массивами, т.к. Garbage Collector всё время чистит память, потому указатели на массивы применять нельзя - нужно каждый раз массив копировать целиком - получаются полные тормоза.
|
|
|
|
|
Mar 7 2011, 19:46
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 3-03-10
Пользователь №: 55 790

|
Цитата(Koluchiy @ Mar 7 2011, 21:32)  Странный у Вас Е1. Раз в 8 быстрее, чем у всех остальных Нормальный, как у всех, если память не изменяет. Зная потенциальную медлительность C#, спрашиваю: изучали латентность вашей программы? Т.е. время между получением (а еще лучше - посылкой )запроса и ответом на запрос. Хотя, с другой стороны, не должно быть ТАКИХ больших задержек (100кБ - почти 100 мсек)...
|
|
|
|
|
Mar 7 2011, 20:18
|
Группа: Новичок
Сообщений: 3
Регистрация: 7-03-11
Пользователь №: 63 454

|
Цитата(Koluchiy @ Mar 7 2011, 22:32)  Странный у Вас Е1. Раз в 8 быстрее, чем у всех остальных...  На ПЛИС 8 потоков E1 мультиплексируется в один, отсюда и скорость 2 Мбайта/с Цитата(Alexium @ Mar 7 2011, 22:46)  Зная потенциальную медлительность C#, спрашиваю: изучали латентность вашей программы? Т.е. время между получением (а еще лучше - посылкой )запроса и ответом на запрос. Насколько я понимаю, время от времени возникают задержки по 10-15 мс, они в принципе не велики, но регулярны, так что если такая задержка произойдет в то время, когда буфер опустошается и ПЛИС требует еще данных, может произойти полное опустошение буфера. А windows может быть виноватым в этом безобразии?
|
|
|
|
|
Mar 7 2011, 21:16
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата Нормальный, как у всех, если память не изменяет. E1 - 2048 КБит/сек.
|
|
|
|
|
Mar 8 2011, 10:04
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата вам никто не сможет гарантировать, что буфер не опустошится. Ну почему же? При грамотном подборе размера буфера и порога опустошения снизить вероятность опустошения до приемлемого уровня вполне реально. Цитата пусть себе по E1 идет поток нулей или последний бит в это время. главное, чтобы на приемном конце логика умела обрабатывать эту ситуацию Это уже будет не совсем Е1.
|
|
|
|
|
Mar 8 2011, 12:02
|
Местный
  
Группа: Свой
Сообщений: 368
Регистрация: 16-11-06
Из: Тверь
Пользователь №: 22 379

|
Цитата(Koluchiy @ Mar 8 2011, 13:04)  Это уже будет не совсем Е1. А чему противоречит поток нулей по E1 (особенно при HDB3  ) ?
|
|
|
|
|
Mar 8 2011, 13:00
|
Знающий
   
Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543

|
Цитата А чему противоречит поток нулей по E1 (особенно при HDB3 rolleyes.gif ) ? Ну будет LOF на приемном конце  . Цитата я неделю (любой достаточно большой промежуток времени) не буду слать пакеты и привет Еще можно провод перерезать  . Цитата это почему это? что хочу, то и передаю. или вы про цикловую синхронизацию? тогда нули относятся к пользовательским данным. Ну будет прерывание разговора/трафика у людей. Ну да, нестрашно. Но разработчика помянут словом матерным  .
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|