Jump to content

    

MALLOY2

Участник
  • Content Count

    838
  • Joined

  • Last visited

Community Reputation

0 Обычный

About MALLOY2

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

Контакты

  • Сайт
    http://
  • ICQ
    0

Recent Profile Visitors

3469 profile views
  1. Chibios+CycloneTcp

    Немного не в тему, вы случаем не знаете где взять документацию на CycloneTCP ?
  2. Еще актуально ?
  3. Имеется кит M80EVB-DGT c прошивкой Revision: M80R01A02W64. Нужно проверить PCM интерфейс. Как я понял эта версия прошивки не поддерживает PCM интерфейс. Кто иожет поделится прошивкой с поддержкой PCM интерфейса ? Также неплохо заиметь схему кита на сайте производителя я ее не нашел но она то должна быть.
  4. Контроллер CAN

    STM32F072 - дешиго и сердито
  5. Hard Fault Exception на кортексе м3

    Если это иар и используется его алокатор, то вам http://supp.iar.com/Support/?note=28545
  6. Попробуйте заменить семистор на семистор технологии 3Q, к примеру серия BTA у nxp;
  7. lwip с Rtos или без Rtos

    ЦитатаБуквально на днях сам на этом обжёгся. lwip ожидает ... lwip ничего не ожидает, это ваше приложение может ожидать, можно сделать и один байт, главное что бы ваше приложение это учитывало и правильно собирало буфер. ЦитатаКак различаете соединения по портам если они все приходят на порт 80 и с одного айпи? Как вы работаете со стеком я не знаю. Но может быть 3 варианта 1) Работа без ОС, 2) Работа с ОС через netconn интерфейс, 3) работа через сокеты (они тоже на самом деле работают через netconn просто это скрыто от пользователя что бы пользователь мог пользоваться стандартным интерфейсом сокетов) в общем для первого варианта у вас есть функция tcp_accept(listen_pcb, callback_accept); которая устанавливает калбек функцию для нового соединения, у этой функции есть параметр struct tcp_pcb *pcb так вот этот pcb так вот этот pcb будет уникален для каждого соединения, следователь при записи или чтения использую эти pcb будете читать от того или другого клиента. Для 2 и 3 случая все ток же создается уникальная структур (сокет) для каждого соединения.
  8. lwip с Rtos или без Rtos

    ЦитатаПервый с копированием данных из pbuf и второй запись указателя в дескриптор на pbuf в dma, в первом скопировал стек продолжает работать. во втором передал указатель и ждем когда произойдет передача. Может еще есть варианты и какой из этих лучше? Вам следует хорошо изучить 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 ЦитатаПонятно. Еще наверно будет проблема без ос, если потребуется управлять через веб интерфейс с нескольких компьютеров. Хотя наверно можно обойтись, слушаем порт 80 как присоединился клиент его апи сохраняем, делаем что то, тут присоединился компьютер с другим айпи ему отправиться последняя страница которую смотрели последний раз,как это лучше реализовать. С ос понятно каждому клиенту новый поток. Проблемы нету, это можно сделать. Но именно это меня и заставило перейти на ОС. Так под ОС это реализовывается очень просто на каждое соединение свой таск. Без ОС это столько всякого гемора. Особенно если надо передавать большие фалы устройству. Когда я это сделал без ОС я понял что у меня получилась своя собственная маленькая ос в программе и зачем это ?. Почему это так я могу рассказать но много писать. Могу сказать так что стек под ОС быстрее работает (следует понимать не скорость передачи,а больше ресурсов остается основной программе), меньше расходуется памяти, да да МЕНЬШЕ. Код становится хорошо читаемым и понимаемым, вместо громадных автоматов состояний. Ну и конечно же надо хорошо понимать много поточность, и как правильно писать под ОС и наче получите что то работающее очень плохо.
  9. lwip с Rtos или без Rtos

    ЦитатаЕсли нет системы не получиться использовать сокет, если правильно понял. Да. Если у Вас пинга нету чего вы лезете к 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 передача: Цитатаerr_t EthernetOutput(struct netif *ethif, struct pbuf *p) { uint8_t* pkt; struct pbuf *q; if (HwEMAC::GetSendBuffer((void**)&pkt,20) != 0 ) return ERR_IF; for(q = p; q != NULL; q = q->next) { memcpy(pkt, q->payload, q->len); pkt += q->len; } HwEMAC::Send(p->tot_len); return ERR_OK; }
  10. lwip с Rtos или без Rtos

    В байтах
  11. stm32 LwIp

    Цитатакак бы роу - в контексте стэка, имеется ввиду сырые пакеты. т.е. юзверь стэка может формировать сам пакеты и сказать - а теперь передатчик съешь это всё. это становится понятно, когда загляните в исходники lwip - там прямо такие кейсы и встретите по коду Не стоит путать сырые пакеты IP с фреймами изернет где могут передаваться фреймы отличные от IP протокола, а RAW сокеты работают с IP пакетами.
  12. stm32 LwIp

    ЦитатаВобщем не смог проследить путь от netconn_write() до места где данные уходят наружу, там мог бы и подменить буфер с фреймом. 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(), не стой стороны копаете, копайте со стороны драйвера МАС.
  13. Регистры Cortex R4.

    Все очень просто, записали в R8 = 12, зашли в прерывание, записали в R8 = 20, вышли, а в R8 попрежнему 12, но когда зайдете опять в прерывание в R8 будет 20.
  14. STM32 Ассемблер. Идеи и приёмы написания

    Цитатано когда пишешь на С, то не всегда очевидно какое огромное кол-во операций может повлечь за собой та или иная простенькая строчка на С. Вы всегда можете открыть листинги и посмотреть что сделал компилятор и подправить.
  15. 2 сетевые карты на компе, САМОЕ ДЕШЕВОЕ РЕШЕНИЕ!!!!