Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Стек TCP IP
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
alexPec
Добрый день всем!

Отладил эзернет на ниосе (ядроMAC с опенкорес). Пример vadimuzzz'а с обработкой arp и icmp ping работает. Хочу прикрутить TCP IP. Вот решил обратиться к сообществу, чтоб не изобретать велосипед...

Как вообще со стеками такими дела обстоят, не наглая моя просьба? sm.gif

Кому не жалко, на мыло пожалуйста киньте.

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

Заранее благодарен.
Alex11
А чем Вас LWIP свободный не устраивает?
alexPec
Цитата(Alex11 @ Dec 13 2012, 01:33) *
А чем Вас LWIP свободный не устраивает?

Да чето читал про него - говорят больше одного коннекта не поддерживает да и вообще говорят проект заброшен...
Или врут злые языки?
Дмитрий Мазунин
Все прекрасно работает. С некоторым допиливанием. (Xilinx)
akorud
Присоединюсь.
Может путаете с uIP?
У нас LWIP прекрасно работает на microblaze и на arm. Наиболее полная реализация из бесплатных.
Количество соединений ограничено размером доступной памяти. Проект развивается - вроде уже есть поддержка IPv6. IP4v - там уже и развивать особо нечего sm.gif
wpost
Цитата(Alex11 @ Dec 13 2012, 01:33) *
А чем Вас LWIP свободный не устраивает?


можно еще niche посмотреть. правда, я его больше года запускал, но я не профессиональный программист =)
gosu-art
интересно rolleyes.gif какую скорость удалось на Ниосе получит?
alexPec
Цитата(gosu-art @ Feb 2 2013, 19:25) *
интересно rolleyes.gif какую скорость удалось на Ниосе получит?

Брал стек микрочипа за основу. Тестировал как раз на днях скорость, которая получилась - 4 мбит/с, ничего аппаратного выше MAC нет, все программно, все контрольные суммы, заголовки и т.д. Учитывая что мне надо 80 кбит/с - за глаза. Проц - ниос (средний, не помню букву), память внешняя асинхронная 16 бит, частота системы 80 мгц. Да, с отключенной оптимизацией, потому как с включенной начинается беда с железом - пишешь 3 раза ноль (например) по одному внешнему адресу (так надо железке), а он (оптимизатор) решает что смысла в этом нет и оставляет запись только одного нуля.
vadimuzzz
Цитата(alexPec @ Feb 3 2013, 15:21) *
Да, с отключенной оптимизацией, потому как с включенной начинается беда с железом - пишешь 3 раза ноль (например) по одному внешнему адресу (так надо железке), а он (оптимизатор) решает что смысла в этом нет и оставляет запись только одного нуля.

это в связи с этим вы заводили тему про отключение оптимизации в определенных функциях?
alexPec
Цитата(vadimuzzz @ Feb 4 2013, 06:46) *
это в связи с этим вы заводили тему про отключение оптимизации в определенных функциях?

Ага, пока что решения не нашел sm.gif Хотелось прочувствовать оптимальность оптимизатора...
vadimuzzz
Цитата(alexPec @ Feb 4 2013, 12:19) *
Ага, пока что решения не нашел sm.gif Хотелось прочувствовать оптимальность оптимизатора...

мне кажется, тут есть несколько вариантов. покажите, что за железка (с точки зрения SOPC - tri-state-bridge?), тайминги и фрагмент кода (можно с ассемблером для наглядности)
alexPec
Цитата(vadimuzzz @ Feb 4 2013, 10:05) *
мне кажется, тут есть несколько вариантов. покажите, что за железка (с точки зрения SOPC - tri-state-bridge?), тайминги и фрагмент кода (можно с ассемблером для наглядности)


Ну да, почти. Проблема возникла с SD-card контроллером, цеплял его на avalon-MM, правда без tristate - не нужен он там. Организация там такая: регистр статуса, данных, управления и еще что-то. При инициализации (в частности) надо три раза записать в регистр данных 0. Эти три нуля уходят в фифо и потом последовательно на SD. Тайминги пока наверно лишнее. Понятно все на уровне кода вроде.
Это проблема с одним из компонентов, дальше (если ее решить) похожее наверняка с остальными какими-нибудь будет.

на С:
Код
     SD_REG(CONTROLL)=1;
     SD_REG(CONTROLL)=0;

     //Reset SD Card. CMD 0, Arg 0.
     //No response, wait for timeout
     SD_REG(TX_CMD_FIFO)=0x40;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;

     while ( SD_REG(TIMER_REG) != 0){}


ASM без оптимизации:

Код
     /* initialise the MMC card into SD-Bus mode, is performed in HW*/
     SD_REG(CONTROLL)=1;
200c568:    00c18034     movhi    r3,1536
200c56c:    18c42504     addi    r3,r3,4244
200c570:    00800044     movi    r2,1
200c574:    18800005     stb    r2,0(r3)
     SD_REG(CONTROLL)=0;
200c578:    00818034     movhi    r2,1536
200c57c:    10842504     addi    r2,r2,4244
200c580:    10000005     stb    zero,0(r2)

     //Reset SD Card. CMD 0, Arg 0.
     //No response, wait for timeout
     SD_REG(TX_CMD_FIFO)=0x40;
200c584:    00c18034     movhi    r3,1536
200c588:    18c42004     addi    r3,r3,4224
200c58c:    00801004     movi    r2,64
200c590:    18800005     stb    r2,0(r3)
     SD_REG(TX_CMD_FIFO)=0x00;
200c594:    00818034     movhi    r2,1536
200c598:    10842004     addi    r2,r2,4224
200c59c:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
200c5a0:    00818034     movhi    r2,1536
200c5a4:    10842004     addi    r2,r2,4224
200c5a8:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
200c5ac:    00818034     movhi    r2,1536
200c5b0:    10842004     addi    r2,r2,4224
200c5b4:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
200c5b8:    00818034     movhi    r2,1536
200c5bc:    10842004     addi    r2,r2,4224
200c5c0:    10000005     stb    zero,0(r2)

     while ( SD_REG(TIMER_REG) != 0){}
200c5c4:    00818034     movhi    r2,1536
200c5c8:    10842604     addi    r2,r2,4248
200c5cc:    10800003     ldbu    r2,0(r2)
200c5d0:    1005003a     cmpeq    r2,r2,zero
200c5d4:    1000011e     bne    r2,zero,200c5dc <mmc_init+0x90>
200c5d8:    003ffa06     br    200c5c4 <mmc_init+0x78>



ASM с оптимизацией:

Код
     /* initialise the MMC card into SD-Bus mode, is performed in HW*/
     SD_REG(CONTROLL)=1;
     SD_REG(CONTROLL)=0;
20073f4:    10bfff04     addi    r2,r2,-4
20073f8:    10000005     stb    zero,0(r2)

     //Reset SD Card. CMD 0, Arg 0.
     //No response, wait for timeout
     SD_REG(TX_CMD_FIFO)=0x40;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;
     SD_REG(TX_CMD_FIFO)=0x00;
20073fc:    10bffb04     addi    r2,r2,-20
2007400:    10000005     stb    zero,0(r2)
2007404:    1807003a     cmpeq    r3,r3,zero

     while ( SD_REG(TIMER_REG) != 0){}
2007408:    183fff26     beq    r3,zero,2007408 <mmc_init+0x3c>
vadimuzzz
SD_REG - это макрос для доступа к регистру? можно его код? мне кажется вам стоит глянуть в сторону инструкции sync и добавить ее в этот макрос
akorud
Цитата(alexPec @ Feb 4 2013, 06:19) *
Ага, пока что решения не нашел sm.gif Хотелось прочувствовать оптимальность оптимизатора...


Код
void set_some_reg(uint32_t value)
{
    *((volatile uint32_t*)(REG_ADDR)) = value;
}

Ключевое слово volatile
Если не хочеться функции, пишем в .h
Код
static inline void set_some_reg(uint32_t value)
{
    *((volatile uint32_t*)(REG_ADDR)) = value;
}
alexPec
Цитата(vadimuzzz @ Feb 5 2013, 12:48) *
SD_REG - это макрос для доступа к регистру? можно его код? мне кажется вам стоит глянуть в сторону инструкции sync и добавить ее в этот макрос


#define SD_REG(REG) *((unsigned char*)(SD_PORT_0_BASE+REG))

Вобщем, для процессора это ячейка памяти по некоторому адресу на шине авалон.

akorud, спасибо за совет. Вроде прокатило:

Код
     SD_REG(CONTROLL)=1;
20073f0:    00c18034     movhi    r3,1536
20073f4:    18c42504     addi    r3,r3,4244
20073f8:    00800044     movi    r2,1
20073fc:    18800005     stb    r2,0(r3)
     SD_REG(CONTROLL)=0;
2007400:    18000005     stb    zero,0(r3)

     //Reset SD Card. CMD 0, Arg 0.
     //No response, wait for timeout
     SD_REG(TX_CMD_FIFO)=0x40;
2007404:    00818034     movhi    r2,1536
2007408:    10842004     addi    r2,r2,4224
200740c:    00c01004     movi    r3,64
2007410:    10c00005     stb    r3,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
2007414:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
2007418:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;
200741c:    10000005     stb    zero,0(r2)
     SD_REG(TX_CMD_FIFO)=0x00;

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