|
Spartan 3an Ethernet(SocketApi) |
|
|
|
Jan 13 2014, 10:46
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
Всем доброго времени суток! Пару месяцев назад решил поднять ethernet на Spartan 3an. Изучил app1026. Там, непосредственно два примера с эхо сервером. Режим RAW API и Socket API. В Raw режиме эхо сервер отработал, все ок. Но задача по сути стоит в передаче данных ацп, которые я сначала записываю в ddr2, затем читаю оттуда и после этого я должен их отправлять на комп. Как я понял, для этой задачи целесообразно использовать Socket API. Я создал в SDK bsp, которая привязана к lwip. Все это вертится на xil_kernel. Добавил. Для начала хочу просто запустить тот же эхо сервер, в socket api режиме(без данных ацп). Затем создал пустой проект в sdk(xilinx C/C++ project) и импортнул файлы сокет приложения, которые предлагал xilinx. Выкладываю ниже архив. После импорта файлов выдает ошибку (еще даже не компилировал) xilkernel_bsp_0/microblaze_0/include/lwip/sys.h:223:14: note: expected 'void *' but argument is of type 'int' ../echo.c:93:3: error: too few arguments to function 'sys_thread_new' ../../xilkernel_bsp_0/microblaze_0/include/lwip/sys.h:223:14: note: declared here make: *** [echo.o] Ошибка 1 Ошибка в файле echo.c в строчке sys_thread_new(process_echo_request, (void*)new_sd, DEFAULT_THREAD_PRIO); Что не так, подскажите, пожайлуста? И в правильном ли я направлении с точки зрения задачи иду. З.ы. В линкер скрипте все линкуется в ddr2, не bram, так что при компиляции ошибок о нехватки ресурсов платы не должно быть
Прикрепленные файлы
src.rar ( 16.27 килобайт )
Кол-во скачиваний: 12
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Jan 13 2014, 11:59
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
Дмитрий, ну да, верно Вы сказали. В библиотечном файле посмотрел - sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio). А в сишном файле echo.c, у функции другие параметры: sys_thread_new(process_echo_request, (void*)new_sd,DEFAULT_THREAD_PRIO); Странно, почему так? Что мне в итоге убрать, а что оставить?
|
|
|
|
|
Jan 14 2014, 08:20
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
В функции заголовка sys.h: sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio); В функции echo.c : sys_thread_new(process_echo_request, (void*)new_sd,DEFAULT_THREAD_PRIO); Добавляю в echo.c параметр из заголовка int stacksize, const char *name, и все равно ругается. Так порлучается что вобще все переменные в коде нужно менять, не только параметры функции? У меня lwip 140. Может Вы выложите свои исходники,Дмитрий , с сокетом,чтобы я сразу их добавил?
Сообщение отредактировал vitali36 - Jan 14 2014, 08:22
|
|
|
|
|
Jan 14 2014, 18:12
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Посмотрел исходники. Вообще говоря, в благородных домах за такой typecasting убивают(что, судя по первому сообщению, компилятор и сделал). В вашем варианте вызов sys_thread_new должен выглядеть примерно так: #define STACKSIZE 4096 const static char *procname = "Echo accepted socket thread"; sys_thread_new(procname,process_echo_request,(void*)new_sd,STACKSIZE,DEFAULT_THR EAD_PRIO) А лучше вот так: sys_thread_new(procname,process_echo_request,(void*)&new_sd,STACKSIZE,DEFAULT_THREAD_PRIO) соответственно в начале process_echo_request вместо int sd = (int)p пишем int sd = *(int *)p;
Размер STACKSIZE должен быть достаточно большой (не менее RECV_BUF_SIZE*1,5, оценка грубая).
|
|
|
|
|
Jan 15 2014, 09:02
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
Избавился от mfs_config.h следующим образом. Не знаю, правильно ли это. Я удалил некоторые файлы где описана работа tftp сервера и web сервера. Оставил только echo. После этого мне выдает ошибки в xil_kernel_bsp такого типа: xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:112: undefined reference to `xget_clock_ticks' в куске кода Код #define TICKS_TO_MS(x) ((x) * SYS_MSPERTICK)
if (timeout) { /* Try to acquire the semaphore within timeout. If not return */ u32_t ticks = xget_clock_ticks(); u32_t nticks = 0; if (!sem_timedwait(sem, timeout)) { /* sem_timedwait returns 0 on success */ nticks = xget_clock_ticks(); if (nticks >= ticks) return TICKS_TO_MS(nticks-ticks); xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:114: undefined reference to `sem_timedwait' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:115: undefined reference to `xget_clock_ticks' ../../xilkernel_bsp_0/microblaze_0/lib\liblwip4.a(sys_arch.o): In function `sys_arch_mbox_fetch': C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:301: undefined reference to `xget_clock_ticks' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:303: undefined reference to `sem_timedwait' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:306: undefined reference to `xget_clock_ticks' collect2: ld returned 1 exit status И все это в файле sys.arch.c
|
|
|
|
|
Jan 15 2014, 10:55
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Погуглил, читаю сюда: xget_clock_ticks() хочет sys/timer.h sem_timedwait() хочет semaphone.h выглядит логичным. Напрягает то, что это пропуски в исходниках lwip, как я понимаю. Но выглядит так, что вы линкеру не показали какие-то библиотеки ядра.
|
|
|
|
|
Jan 15 2014, 17:33
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Да там в СДК когда проект создаешь, подключаются библиотеки и модули галочками, после чего средой создаются хедеры, и все подгружается. LwIP изначально работает из компиленных библиотек, исходники явно не включаются в проект, их добавление руками вызывает проблемы и так далее...
Просто изначально надо было делать все последовательно, а человек видать нашел чей-то проект, сгенерил к нему свое "железо" и теперь мучается... Если делать по шагам по мануалу с нуля все как написано, все запускается, да еще с правильными версиями...
|
|
|
|
|
Jan 16 2014, 07:53
|
Местный
  
Группа: Свой
Сообщений: 259
Регистрация: 19-09-05
Из: Екатеринбург
Пользователь №: 8 715

|
Цитата(Golikov A. @ Jan 15 2014, 23:33)  Просто изначально надо было делать все последовательно, а человек видать нашел чей-то проект, сгенерил к нему свое "железо" и теперь мучается... Если делать по шагам по мануалу с нуля все как написано, все запускается, да еще с правильными версиями... Полностью согласен.
|
|
|
|
|
Jan 17 2014, 08:49
|
Местный
  
Группа: Свой
Сообщений: 327
Регистрация: 30-10-05
Пользователь №: 10 288

|
Цитата(SM @ Jan 17 2014, 11:02)  Поясните, как сокеты могут быть связаны с операционной системой? У ТС проблемы не с socket API, у ТС проблемы именно с "ядерными" API (threading, semaphores, timers)
|
|
|
|
|
Jan 17 2014, 09:19
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
Вообщем пока отбой) Покопался на форумах xilinx. Проблема всех этих ошибок, что Георгий описал выше, а именно: Код xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:114: undefined reference to `sem_timedwait' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:115: undefined reference to `xget_clock_ticks' ../../xilkernel_bsp_0/microblaze_0/lib\liblwip4.a(sys_arch.o): In function `sys_arch_mbox_fetch': C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:301: undefined reference to `xget_clock_ticks' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:303: undefined reference to `sem_timedwait' C:\Users\vitaliy\workspace7\xilkernel_bsp_0\microblaze_0\libsrc\lwip140_v1_01_a\src/contrib/ports/xilinx/sys_arch.c:306: undefined reference to `xget_clock_ticks' заключалась в следующем: нужно было в BSP настройках, где ОС xilkernel, config_time поставить true. Вобщем буду щас пробовать запускать
|
|
|
|
|
Jan 17 2014, 09:59
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(SM @ Jan 17 2014, 11:02)  Поясните, как сокеты могут быть связаны с операционной системой? Сокеты это совершенно свое API, которое может быть представлено в составе ОС, может быть отдельно, без ОС, а может быть даже в чисто "железном" виде, как например чипы WizNet, которые имеют интерфейс в виде сокетов. Не совсем мне вопрос, но ответ я знаю "так получается"  ... Это ксалиновская идея, надо понимать что LwIP у них - это не совсем LwIP, а некая сделанная ими библиотека на основе LwIP, которая связана с железом, маками и прочим уже внутри себя. И они пишут что если вы хотите можете гонять ее в режиме Raw API, и все таймеры дергать руками, либо в режиме Socket API, но в это случае добро пожаловать, используйте операционку. Собственно я так понимаю это от того что функции в socket API у них блокирующие и все нафиг повиснет и работать не будет. Вот. Так что это не про сокеты, а про сокеты ксалинкса, именно ихнего LwIP. Наверняка можно аккуратно пересобрать все из исходников, и подправить функции чтобы они работали без операционки, но это муторно как-то и не похоже что ТС хочет идти этим путем.
|
|
|
|
|
Jan 17 2014, 10:09
|
Частый гость
 
Группа: Участник
Сообщений: 88
Регистрация: 2-07-13
Пользователь №: 77 354

|
Что-то не получается пингануть плату. Самое главное когда в sdk уже запускаю, процесс компиляции проходит без ошибок, но в терминале где сообщения с ком-порта приходят пусто. В адресной строке пишу(хотя смысла не было, плата то не пингуется) http://192.168.1.10 -тоже не работает. Почитал xapp1026 про tftp,web server applications. Там говорится(если я правильно понял) что сначала нужно запустить mfs image. И как я понял это memory file system, что я ставил галочку при настройках ядра. Так ли это, что это воообще за mfs image, и как его заюзать
Сообщение отредактировал vitali36 - Jan 17 2014, 10:10
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|