Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2021-окт-23 17:10

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 50 сообщений ]  На страницу « 1 2 3 4 »
Автор Сообщение
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-02 12:45 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Просто преобразуйте этот указатель в указатель на байты:
unsigned char *data = (unsigned char *)pUDPData;
и работайте с массивом байт. Указатель на void используют, когда
1. хотят подчеркнуть, что в данном случае структура данных (тип данных) не важна как, например, в стандартной функции memcpy.
2. когда хотят сделать несколько функций для разных типов данных, но с одинаковыми типами входных параметров, чтобы можно было их присваивать одному указателю на функцию.

Без преобразования к другому типу с указателем на void работать нельзя, но зато преобразование другого указателя к указатею на void делается неявно, то есть
int *p;
void *vp = p; // не надо писать void *vp = (int *)p;
Преобразование в обратную сторону должно быть явным. Строго говоря, в Си в отличии от C++ может быть неявным, но лучше везде делать явным.

Наверно, в функции OnUDPReceive() не стоило использовать указатель на void, но это мелочь.


Последний раз редактировалось Сергей86 2015-дек-03 14:54, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-02 15:46 
Не в сети

Зарегистрирован: 2015-окт-02 16:13
Сообщения: 28
Спасибо. Немного разобрался. Что я сделал:
1. В функции OnUDPReceive() скопировал полученные данные к себе в буфер, запомнил количество полученных данных и выставил флаг что данные получены.
2. В основном цикле main анализирую флаг получения данных и копирую данные из своего приемного буфера в буфер на передачу, выставляю флаг на передачу и сбрасываю флаг полученных данных.
3. В этом же цикле анализирую флаг на передачу и в случае если надо передавать, то отправляю подготовленный ранее буфер передатчика при помощи SendViaUDP(), сбрасываю флаг на передачу.
Все сделано лишь с одной целью - понять где данные, в каком они формате и научится отправлять данные в ответ. Все заработало.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-03 16:54 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 96
Откуда: ЗАО "Московский Прожекторный завод"
Ого, в теме оживление :)

Ну, я не знаю, вообще я использовал void* только потому, что через UDP можно передать любую структуру данных. То есть если у Вас есть какой-нибудь Blah_Blah_Struct_Typedef, то Вы можете отправить её через UDP так:
SendViaUDP ( ..., ..., &Blah_Blah_Struct, sizeof(Blah_Blah_Struct_Typedef) );
То есть именно для того, чтобы подчеркнуть, что тип данных может быть любым. А массив байт - это уже частный случай, хотя под него можно подогнать любой тип... В принципе, предложения принимаются, я не очень опытный программист, не очень хорошо знаю тонкости языка, поэтому буду благодарен за советы. У меня по работе опять возник проект, в котором придётся использовать UDP, плюс есть несколько идей как оформить это в виде библиотеки. Может ещё пару протоколов добавлю (если времени хватит). Думаю, это вопрос ближайших двух месяцев.

Да, сделать "автоответчик" протокола UDP можно проще:
OnUDPReceive ( ..., ..., void pData, uint16_t DataSize ) {
   SendViaUDP ( ..., ..., &Blah_Blah_Struct, sizeof(Blah_Blah_Struct_Typedef) );
}
Т.е. функция OnUDPReceive вызывается тогда, когда в ОЗУ уже есть данные, принятые по UDP. Вы можете вызвать функцию SendViaUDP, передав ей в качестве аргумента указатель на эти данные и их размер.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-03 17:28 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Насчет указателя на void в функции SendViaUDP никаких вопросов нет. Обратите внимание, что я писал про функцию OnUDPReceive, но в любом случае это мелочь или даже дело вкуса или даже я неправ))) Еще раз спасибо за UDP.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-03 18:54 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 96
Откуда: ЗАО "Московский Прожекторный завод"
Ну, может быть Вы и правы, я же не спорю :) Просто хотелось бы понять, какой тип данных было лучше поставить, и почему. Был бы очень Вам признателен, если бы объяснили )


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2015-дек-03 20:38 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Я предлагал заменить void* на uint8_t* в функции OnUDPReceive, потому что void* вводит в заблуждение будто его можно преобразовать к любому типу указателя, но из-за требования к выравниванию данных это может быть не так. Заглянул внутрь Вашего кода и как я понял, у Вас pUDPData всегда указывает на адрес, выровненный по 32-битному слову, так что его можно преобразовывать к любому типу указателя, по-этому предлагаю его оставить и написать комментарий, что pUDPData всегда указывает на адрес, выровненный на границу 32-битного слова.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-апр-21 15:41 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 96
Откуда: ЗАО "Московский Прожекторный завод"
Обнаружена ошибка в выборе MAC-адреса... Если в таблице IP-адресов нет искомого IP-адреса, то в качестве MAC-адреса выбирается мусор. Проблема в функции GetMACFromIP и в управлении таблицей соответствий IP- и MAC-адресов. Исправлять пока времени нет...


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-апр-28 18:44 
Не в сети

Зарегистрирован: 2014-фев-17 10:09
Сообщения: 16
Откуда: Рязань
Обошли эту проблему путем выбора мак адреса по-моему в функции OnEthernetReceive, в ней сохраняем мак в отдельную переменную и используем его для ответа, смогу выложить на следующей неделе.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-май-30 09:13 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 21
Здравствуйте.
Спасибо за выложенную реализацию протокола!

Вопрос по скорости передачи. Кто-нибудь ее тестировал?
Что-то у меня какие-то неутешительные результаты...
Открыть
Вложение:
Комментарий к файлу: Скорость передачи
[ attachment ]
udp_test.PNG [ 55.21 КБ | 8914 просмотров ]
Закрыть
В чем может быть проблема?
Плата 4-ой ревизии. Использую проект из данной темы


Последний раз редактировалось Dots 2016-июн-01 07:49, всего редактировалось 1 раз.

Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-май-30 12:19 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-окт-19 17:25
Сообщения: 556
Откуда: г. Владимир ОАО "ВКБР"
Dots писал(а):
Здравствуйте.
Спасибо за выложенную реализацию протокола!

Вопрос по скорости передачи. Кто-нибудь ее тестировал?
Что-то у меня какие-то неутешительные результаты...
Открыть
[ img ]
Закрыть
В чем может быть проблема?
Плата 4-ой ревизии. Использую проект из данной темы
1. Заливайте картинки прямо на форум, иначе модераторы сделают замечание или потрут Ваш пост, причём вполне обоснованно, потому как здешний форум это кладезь информации, а картинки с радикалов потом удалятся/перенесутся, исчезнут и т.д. Это я ещё про рекламу не говорю)

2. Слабовато, 13-18Мбит/сек в обе стороны одновременно, без ошибок, с небольшой обработкой минимум и 65Мбит/сек если просто гнать поток в одну из сторон.
У LDM-SYSTEMS должна быть утилитка, с исходниками, прошивкой и проектом для МК, но это Вы им лучше пишите. Я правда думаю, что внимание оптимизации там не уделялось, но это Вы уж с ними сами переговаривайтесь.

_________________
"В радиотехнике, как в церкви - многое не понятно, но приходится верить"
ВлГУ. к.т.н Садовский Н.В


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-май-31 07:43 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 21
НЕМАН,
О какой утилите идет речь?
Есть предположения, что подобные небольшие скорости могут быть связаны с
программным вычислением crc, но как иначе... аппаратного ведь нет.
В принципе, пока не очень ясна причина. Хотя бы аппаратная или программная (реализация того же драйвера mac-уровня).
Возможно, сталкивался кто-нибудь с подобной проблемой. Какие есть варианты решения?

P.S. За замечания спасибо. Буду знать.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-май-31 14:30 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-окт-19 17:25
Сообщения: 556
Откуда: г. Владимир ОАО "ВКБР"
Dots писал(а):
НЕМАН,О какой утилите идет речь?
Ну напишите им на info@ldm-systems.ru, я ей относительно недавно пользовался, но куда я её запихал уже не вспомню. У меня отладочник их есть и как-то просто с ними заходил разговор о тестировании скорости. Проверил, вроде работает, ну и ладно.
Там проект и .hex для МК, проект и .exe для компа. Запускать можно компьютер-компьютер и компьютер-МК, а скорости я Вам выше привёл. В МК кроме Эзернета ничего не задействовано и, ещё требование, чтобы кварц был на 16МГц.
Они её видимо делали для себя, чтобы можно было тестировать самые различные платы с ВЕ1, дескать собрали-зашили-живая/неживая.

P.S. Просьба - отредактируйте своё сообщение выше, залейте картинку на форум, а то как-то не хочется каждый раз на радикал с рекламой лазить.

_________________
"В радиотехнике, как в церкви - многое не понятно, но приходится верить"
ВлГУ. к.т.н Садовский Н.В


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-июн-01 10:54 
Не в сети

Зарегистрирован: 2014-май-20 09:07
Сообщения: 96
Откуда: ЗАО "Московский Прожекторный завод"
Здравствуйте!
Насчёт скорости могу сказать следующее: для MAC-подуровня CRC вычисляется на аппаратном уровне, самим контроллером. Уж не знаю, насколько эффективно это сделано, подозреваю, что эффективно из без задержек, но 100% гарантии нет. Для других протоколов CRC вычисляется программно. Т.е. для Вашей ситуации происходит вот что: клиент на ПК отправляет пакет UDP микроконтроллеру, в микроконтроллере производится копирование данных из буфера приёмника в ОЗУ, затем производится контроль CRC пакетов IP и UDP подуровней (точно не помню, может быть какие-то CRC не проверяются), после чего начинается отправка полученных данных обратно: данные пакета UDP копируются в другую область ОЗУ, формируется заголовок UDP, вычисляется CRC протокола UDP, затем формируется заголовок IP, вычисляется CRC пакета IP, затем формируется заголовок MAC, затем сформированный пакет копируется в буфер передатчика.
Ускорить работу можно, если работать напрямую с буферами приёмника и передатчика, не копируя данные в ОЗУ, обрабатывая их прямо в буферах и формируя пакеты прямо в буферах. Это значительно ускорит работу. Но это сделает библиотеку более связанной с аппаратной частью, как это сделать изящно я пока не придумал.


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-сен-20 17:45 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Обнаружилась проблема. Пакеты от микроконтроллера не проходят через гигабитный свич. Даже если между микроконтроллером и гигибитным свичем поставить мегабитный свич - все равно не проходят. Например, ARP запрос от микроконтроллера не проходит через гигабитный свич, а точно такой же, с точностью до бита (смотрим в Wireshark), запрос от ЭВМ проходит. Кто-нибудь сталкивался с таким, какие есть предположения?


Вернуться к началу
 Заголовок сообщения: Re: Протокол UDP для 1986ВЕ1Т
СообщениеДобавлено: 2016-окт-01 10:55 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 21
В одной из модификаций проекта словил Hard Fault.
Причиной послужила структурная переменная Rec (в исходном проекте объявлена в модуле Application.c, строка 33).
Компилятор присваивал ей адрес, не кратный 4. В процедуре чтения Ethernet-пакета ReadPacket() (модуль Ethernet.c, строка 609)
адрес переменной Rec присваивался указателю dst. Далее указатель инкрементировался и случался Hard Fault...

Ситуацию исправило выравнивание переменной:
_Rec_Frame Rec __attribute__ ((aligned (4)));


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 50 сообщений ]  На страницу « 1 2 3 4 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB