Jump to content

    

MALLOY2

Участник
  • Content Count

    817
  • Joined

  • Last visited

Community Reputation

0 Обычный

About MALLOY2

  • Rank
    Знающий
  • Birthday 06/10/1980

Контакты

  • Сайт
    Array
  • ICQ
    Array

Recent Profile Visitors

3617 profile views
  1. Chibios+CycloneTcp

    Немного не в тему, вы случаем не знаете где взять документацию на CycloneTCP ?
  2. Имеется кит M80EVB-DGT c прошивкой Revision: M80R01A02W64. Нужно проверить PCM интерфейс. Как я понял эта версия прошивки не поддерживает PCM интерфейс. Кто иожет поделится прошивкой с поддержкой PCM интерфейса ? Также неплохо заиметь схему кита на сайте производителя я ее не нашел но она то должна быть.
  3. STM32F072 - дешиго и сердито
  4. Если это иар и используется его алокатор, то вам http://supp.iar.com/Support/?note=28545
  5. Попробуйте заменить семистор на семистор технологии 3Q, к примеру серия BTA у nxp;
  6. lwip ничего не ожидает, это ваше приложение может ожидать, можно сделать и один байт, главное что бы ваше приложение это учитывало и правильно собирало буфер. Как вы работаете со стеком я не знаю. Но может быть 3 варианта 1) Работа без ОС, 2) Работа с ОС через netconn интерфейс, 3) работа через сокеты (они тоже на самом деле работают через netconn просто это скрыто от пользователя что бы пользователь мог пользоваться стандартным интерфейсом сокетов) в общем для первого варианта у вас есть функция tcp_accept(listen_pcb, callback_accept); которая устанавливает калбек функцию для нового соединения, у этой функции есть параметр struct tcp_pcb *pcb так вот этот pcb так вот этот pcb будет уникален для каждого соединения, следователь при записи или чтения использую эти pcb будете читать от того или другого клиента. Для 2 и 3 случая все ток же создается уникальная структур (сокет) для каждого соединения.
  7. Вам следует хорошо изучить PBUF, в pbuf пакет может лежать не одним цельным, а кусками этот код собирает из кусков 1 целый буфер. for(q = p; q != NULL; q = q->next) {[quote][/quote] memcpy(pkt, q->payload, q->len); pkt += q->len; } Это можно конечно исправить, установив в настройках размер PBUF максимальному размеру фрейма. Но это очень большое расточительство памяти и никак не оправдывает себя. Есть маленький плюс позволяет сделать зеро копи драйвер. Но выигрыш очень мизерный. А памяти все будет жрать немерено. У меня сделано так. Для дма драйвера выделено 2-4 буфера на передачу размером в максимальный фрейм (1512 по моему). Есть указатель на текущий буфер. Я его беру туда копирую pbuf, запускаю передачу дма, а текущему указателю присваиваю адрес следующего буфера и так по кругу. С приемом также есть от 2 - 16 (буферов дма размером в фрейм), есть указатель на текущий. Так как я использую ОС нет необходимости для приема использовать прерывания, так как дма умеет по кругу писать в буфера. Буру текущий указатель проверяю есть ли новый фрейм если есть, копирую его в новый pbuf, этот мечу свободным передвигаю указатель на следующий. И так по кругу. У меня stm32f107 UDP - 70 Mbit/s TCP - 52 Mbit/s (4 буфера на передачу и 4 буфера на прием). #define PBUF_POOL_SIZE 24 #define PBUF_POOL_BUFSIZE 256 Проблемы нету, это можно сделать. Но именно это меня и заставило перейти на ОС. Так под ОС это реализовывается очень просто на каждое соединение свой таск. Без ОС это столько всякого гемора. Особенно если надо передавать большие фалы устройству. Когда я это сделал без ОС я понял что у меня получилась своя собственная маленькая ос в программе и зачем это ?. Почему это так я могу рассказать но много писать. Могу сказать так что стек под ОС быстрее работает (следует понимать не скорость передачи,а больше ресурсов остается основной программе), меньше расходуется памяти, да да МЕНЬШЕ. Код становится хорошо читаемым и понимаемым, вместо громадных автоматов состояний. Ну и конечно же надо хорошо понимать много поточность, и как правильно писать под ОС и наче получите что то работающее очень плохо.
  8. Да. Если у Вас пинга нету чего вы лезете к tcp_slowtmr ??? вам нужен только ARP, IP, ICMP. В изернете нельзя передавать пакеты меньшие 64 байт!!!, многие МАС не умеют дополнять пакет если он меньше 64 байт это надо будет сделать вам самим. STM32 умеет это делать но п омоему надо где то битик установить. P.S. Все по шагам. 1) Делаем функцию приема кадров изернет. Запускаем ее проверяем что она принимает правильно. Буфер расшифровываем в уме. 2) Делаем функцию передачи, создаем константный фрейм, засовываем его в функцию ловим ваершарком убеждаемся что все ок. 3) Прикручиваем эти функции к стеку. 4) Запускаем пинг. Смотрим ARP таблицу, если ваш МАС есть а девайс не пингается что с IP + ICMP, Если в таблице нету вашего МАСа копаем ARP. 5) Потом уже UDP + TCP Я использую FreeRTOS + LwIP примерно так у меня выглядят функции драйвера (прием вынесен в отдельную задачу) Прием: __task void EthernetDeamon(void *arg) { int32_t size; struct pbuf *p,*q; uint8_t* pkt; struct netif *ethif = (struct netif *)arg; for(;; ) { size = HwEMAC::RecivePacket((void**)&pkt, 1000); if ( size > 0 ) { p = pbuf_alloc(PBUF_RAW, size, PBUF_POOL); if (p != NULL) { for (q = p; q != NULL; q = q->next) { memcpy((u8_t*)q->payload, pkt, q->len); pkt += q->len; } HwEMAC::Recived(); if (tcpip_input(p,ethif) != ERR_OK) pbuf_free(p); } } else { LINKSTATUS_t ls = HwPHY::LinkStatus(PHY_ADDR); if ( ls == NOLINK ) { netif_set_link_down(ethif); HwEMAC::Stop(); } else { if (!netif_is_link_up(ethif)) { HwEMAC::Start(ls); netif_set_link_up(ethif); } } } } }; P.S. tcpip_input - используется если стек работает в режиме ОС (NO_SYS = 0), если без ос то фреймы нужно запихивать в ethernet_input передача:
  9. stm32 LwIp

    Не стоит путать сырые пакеты IP с фреймами изернет где могут передаваться фреймы отличные от IP протокола, а RAW сокеты работают с IP пакетами.
  10. stm32 LwIp

    1. Вам нужно найти место где инициализируется структура ethif->output = etharp_output; ethif->linkoutput = EthernetOutput; //EthernetOutput - Это и есть вывод фремом естесно у Вас она может по другому называться скажем так low_level_output ethif->input = tcpip_input; //tcpip_input - Сюда принятые фреймы засовываются если используется ОС и ethernet_input - если неиспользуется ОС ethif->mtu = 1500; ethif->flags = NETIF_FLAG_BROADCAST|NETIF_FLAG_ETHARP; //broadcast capability P.S. Странный подход у Вас вам нужны вреймы а вы их пытаетесь проследить от netconn_write(), не стой стороны копаете, копайте со стороны драйвера МАС.
  11. Все очень просто, записали в R8 = 12, зашли в прерывание, записали в R8 = 20, вышли, а в R8 попрежнему 12, но когда зайдете опять в прерывание в R8 будет 20.
  12. Вы всегда можете открыть листинги и посмотреть что сделал компилятор и подправить.
  13. 2 сетевые карты на компе, САМОЕ ДЕШЕВОЕ РЕШЕНИЕ!!!!