Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Spartan 3an Ethernet(SocketApi)
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
vitali36
Всем доброго времени суток! Пару месяцев назад решил поднять 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, так что при компиляции ошибок о нехватки ресурсов платы не должно быть
Дмитрий Мазунин
Не хватает параметров функции sys_thread_new(const char *name, void (* function)(void *arg), void *arg, int stacksize, int prio)
Конкретно параметра stacksize и name (вроде бы)
vitali36
Дмитрий, добавил size(у меня так названа эта переменная) sys_thread_new(process_echo_request, (void*)new_sd, size, DEFAULT_THREAD_PRIO);
и все равно ошибка. Clean пробовал тоже после этого - та же песня...(
name нигде не фигурирует у меня. Есть int sock. sock это и есть этот "name"?
Дмитрий Мазунин
sys_thread_new(const char *name, void (* function)(void *arg), void *arg, int stacksize, int prio)
см. файл sys_arch.c
name - имя треда, строка
vitali36
Дмитрий, ну да, верно Вы сказали. В библиотечном файле посмотрел - 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);
Странно, почему так? Что мне в итоге убрать, а что оставить?
Дмитрий Мазунин
Потому, что пример от предыдущей версии LWIP, там был другой формат sys_thread_new
Посмотрите внимательно sys_arch.c - код sys_thread_new, будет все понятно с параметрами
vitali36
В функции заголовка 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
Изменял параметры в функции, сыпятся еще и еще ошибки. Проблема с версиями lwip. У меня lwip 140. Эти файлы что я выкладывал под другую верси lwip. У КОГО ЕСТЬ ИСХОДНИКИ по Socket API, отпишите пожалуйста!
gosha-z
Посмотрел исходники. Вообще говоря, в благородных домах за такой 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, оценка грубая).
vitali36
Новая ошибка. /dispatch.c:19:23: fatal error: lwip/inet.h: No such file or directory и варнинг в этом же файле #include "lwip/ip_addr.h"
В xil_kernel_bsp настройках lwip галочка стоит(подключен)




Предыдущую исправил с inet.h.
Добавил недостающие параметры в функции sys_thread_new("name",process_echo_request, (void*)new_sd, 2048 , DEFAULT_THREAD_PRIO);
Добавил "name", и размер стэка 2048.
Функцию теперь эту как ошибку не показывает компилятор, зато появилась новая: http_response.c:21:24: fatal error: mfs_config.h: No such file or directory.
vitali36
Избавился от 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
gosha-z
mfs_config.h - это Xilinx Memory File System - ищите в инклюдах ядра.
vitali36
gosha-z, спасибо! нашел в настройках 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'
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
gosha-z
Погуглил, читаю сюда:
xget_clock_ticks() хочет sys/timer.h
sem_timedwait() хочет semaphone.h
выглядит логичным.
Напрягает то, что это пропуски в исходниках lwip, как я понимаю. Но выглядит так, что вы линкеру не показали какие-то библиотеки ядра.
Golikov A.
Да там в СДК когда проект создаешь, подключаются библиотеки и модули галочками, после чего средой создаются хедеры, и все подгружается. LwIP изначально работает из компиленных библиотек, исходники явно не включаются в проект, их добавление руками вызывает проблемы и так далее...

Просто изначально надо было делать все последовательно, а человек видать нашел чей-то проект, сгенерил к нему свое "железо" и теперь мучается... Если делать по шагам по мануалу с нуля все как написано, все запускается, да еще с правильными версиями...
Дмитрий Мазунин
Цитата(Golikov A. @ Jan 15 2014, 23:33) *
Просто изначально надо было делать все последовательно, а человек видать нашел чей-то проект, сгенерил к нему свое "железо" и теперь мучается... Если делать по шагам по мануалу с нуля все как написано, все запускается, да еще с правильными версиями...

Полностью согласен.
vitali36
Я понимаю, что проблемы с версиями. что lwip у меня не 1.3, а 1.4. Но дело в том, что у меня в sdk нельзя создать именно socket api приложение. Там только lwip echo project. Он создается на ОС standalone. Со своим xilkernel bsp я могу создать только пустой проект. ну еще там есть xilkernel posix threads demo. Т.е исходников именно под мою версию lwip мне взять негде. Вот мне Дмитрий Мазунин скидывал исходники, что я выклдавал вначале. Но там под 1.3 lwip, поэтому косяки вылетают..(
Golikov A.
правильно было написать

"я понимаю что проблема с версиями.... но дело в том что я не стал разбираться как сделать socket api приложение...."


Soket API приложение требует операционной системы. Операционная система может быть как внешняя так предоставленная от ксалинкса. При создании проекта надо выбирать не stand alone, а тот что с операционкой. В нем добавлять LwIP, и дальше действовать по мануалу.

В Stand alone процессоре неправильно ожидать наличие примеров для операционной системы...

SM
Поясните, как сокеты могут быть связаны с операционной системой? Сокеты это совершенно свое API, которое может быть представлено в составе ОС, может быть отдельно, без ОС, а может быть даже в чисто "железном" виде, как например чипы WizNet, которые имеют интерфейс в виде сокетов.
vitali36
A.Golikov, здравствуйте) Сначала при создании можно выбрать standalone/linux. Я выбираю стандалон, но в след окне вместо стандалон ставлю xil_kernel(bsp, что я создал). Т.е ОС xilkernel. Так написано в xapp1026 про socket api application, что нужно поставить ос xilkernel, помимо lwip
gosha-z
Цитата(SM @ Jan 17 2014, 11:02) *
Поясните, как сокеты могут быть связаны с операционной системой?

У ТС проблемы не с socket API, у ТС проблемы именно с "ядерными" API (threading, semaphores, timers)
vitali36
Вообщем пока отбой) Покопался на форумах 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.
Вобщем буду щас пробовать запускать
Golikov A.
Цитата(SM @ Jan 17 2014, 11:02) *
Поясните, как сокеты могут быть связаны с операционной системой? Сокеты это совершенно свое API, которое может быть представлено в составе ОС, может быть отдельно, без ОС, а может быть даже в чисто "железном" виде, как например чипы WizNet, которые имеют интерфейс в виде сокетов.

Не совсем мне вопрос, но ответ я знаю "так получается" sm.gif...

Это ксалиновская идея, надо понимать что LwIP у них - это не совсем LwIP, а некая сделанная ими библиотека на основе LwIP, которая связана с железом, маками и прочим уже внутри себя. И они пишут что если вы хотите можете гонять ее в режиме Raw API, и все таймеры дергать руками, либо в режиме Socket API, но в это случае добро пожаловать, используйте операционку.

Собственно я так понимаю это от того что функции в socket API у них блокирующие и все нафиг повиснет и работать не будет.

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

Golikov A.
в свойствах LwIP поставьте галочки на дебуг всего, и поглядите чего у вас там происходит.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.