Перейти к содержанию
    

..UDP данные из шины CAN..писать свой UDP/IP стек,..поддержка ARP и IGMP, которые тоже нужно будет реализовать.

 

сразу переходите на четвёрку - не пожалеете, если других или религиозных привязок нет.

по поводу lwip-а - там реализация указанных уровней вполне. Вы только ещё забыли(или показалось? :) ) IP уровень, дефрагментацию.

в указанном стэке это реассемблирование обзывают.

 

по моему лучше взять за прототип указанный стэк, внимательно прошерстить его, выкинуть всё не нужное, переписать (обязательно)

работу с железом - она там ужас не оптимальна как. ну и поработать с этим получше (в плане протестировать). желательно создавая

различные ошибочные ситуации в сети.

 

я переписываю сейчас стэк под свои задачи - надо убрать статичные данные, оптимизнуть, ну и вылизать.

много уже вгрохал времени в это(и даже немного подумал что дюже круто заложил штурвал - но уже подвёл под отладку практически).

надо сказать объём не плохой (поддерживаемых протоколов, навёрнутых решений в коде).

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

можно ещё добавить, что пишут несколько человек его - посему возможны технические ляпы.

 

ЗЫ

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

причём проверил специально последнии две версии стэка 1.4.0, 1.4.1 - такая же фигня. тащат ошибки как гири на ногах...

 

static uint8_t A;

foo()
{
  uint8_t B = A;
  A = 1;
  //
  if (!B)
  {
    // бла-бла-бла
    A = 0;
  }
}

 

ЗЫ ЗЫ

это в принципе не совсем трабловый - так, немного курьёзный кусок. а вот если не будет лень - потом выложу уже более

серъёзный трабл - с потенциальной утечкой памяти (при не стандартном трафике в сети).

Изменено пользователем kolobok0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а чего плохого в этом куске?

 

сохранили состояние А, сделали его единицей.

что-то поделали, и вернули его исходное состояние...

 

 

стандартный симафорчик, или я что-то упускаю?

 

 

а как переход на stm32f407 упростит жизнь и избавит от ARP и IGMP?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а как переход на stm32f407 упростит жизнь

У stm32f407 тактовая 168 МГц и ноль циклов ожидания против 72 МГц и 2 циклов ожидания у stm32f107.

и избавит от ARP и IGMP?

Не избавит, имел ввиду, что если свой UDP реализовать, то ARP и ICMP нужно делать тоже, а в их простоте я пока не уверен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

сохранили состояние А, сделали его единицей.

что-то поделали, и вернули его исходное состояние...

...

 

мдя, судя по приведённому коду - вполне может было бы и быть место, но если развернуть бла-бла-бла то картина как то не совсем та:

в данном месте идёт вызов выполнения функции Xru в контексте другого потока. В начале этой функции (перед собственно

циклом выполняющего основную работу) сбрасывается этот "семафорчик". Т.е. следуя этой логике - семафорчик только на саму передачу

управления(не блокируя вызывающий поток) другому потоку.

 

т.е. если список достаточно длинный, то могут запуститься две и более функций. кхм. ышо более кучерявей...

 

static uint8_t A;


Xru()
{
  A = 0;   // <= сбрасываем при входе в функцию
  //
  for (...)
  {
      тут работа со списком. освобождаем память, возвращая в пул использования
  }
}

foo()
{
  uint8_t B = A;
  A = 1;
  //
  if (!B)
  {
    передача на выполнение в контексте другого потока функции Xru(). не блокирующий вызов.
    A = 0;  // <= если произошла ошибка при передачи управления другому потоку.
  }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использую стек Кейла. Чтобы изменить номер порта, как я понимаю нужно пересоздать сокет? Это както можно без перезагрузки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

закрыть старый сокет, и открыть новый, перезагрузка то зачем?

сокет закрывается двойным close, а потом еще подождать.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В начале cgi_process_var объявляется переменная:

  int s[4];

Далее используется вот так:

        
LocM.IpAdr[0]   = s[0];
LocM.IpAdr[1]   = s[1];
LocM.IpAdr[2]   = s[2];
LocM.IpAdr[3]   = s[3];

Вопрос, а почему int ? Я чего-то не понимаю?

 

сокет закрывается двойным close

что-то не совсем понимаю. как это двойным?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

int - просто так... напишите чар если хотите или uint8_t так совсем правильно будет...

проц 32 битный, ему что чар что инт одинаково по времени копировать-присваивать, а в некоторых даже быстрее 32 бита, масками резать не надо....

 

если вы сокету вызовите close, то незаконекченый закроется, а законекченный разорвет соединение и перейдет в листен моде, потому и надо вызывать клоуз 2 раза, чтобы точно все закрыть. Собственно об этом и написано в документации, которую стоит почитать...

 

tcp_close

 

кстати для смены IP надо его просто подменить и все, даже перегружать ничего не надо...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про int я спросил потому что сталкивался с проблемами если не приводить тип явно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых int таки ообосновано там стоит. Расчет на широкий круг пользователей так сказать. Теперь вопрос по tcp_close. Если например, я всегда буду вызывать два раза не разбирая состояние сокета, то не будет ли это ошибкой? И еще такой вопрос. На каком-то этапе происходит подстановка дефолтных сетевых настроек. Как мне правильно и в какой момент подставлять настройки, сохраненные в еерrom так чтобы инициализация при старте происходила с сохраненными настройками, а не с дефолтными?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если вызывать close 2 раза сокет закроется, в некоторых случаях клоуз вернет код ошибки, но никаких фатальных экцепщинов не будет. Уточните в инструкции, там есть как раз про двойной вызов клоуза, возможно нужна пауза или событие обработки стэка между ними. Поищите по tcp_close.

 

Сетевые настройки подставляются сразу по изменению. То есть если вы меняете IP, маску, или что-то, то как только вы это сделали стэк сразу начинает работать на новых настройках.

Последовательность такая

задаете нулевые настройки (IP = 0.0.0.0)

запускаете DHCP

ждете результатов его работы, если IP не меняется, не становиться не нулевым

выключаете DHCP

задаете IP из флэшки

 

номер порта применяется при создании сокета.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня 3 сокета в проекте, на каждом свой тип данных.

Тоже возникла такая задача. Только не 3 а 2. Не подскажете как делали? Я пробовал создать 2 с разными обработчиками. Вылетало в ошибку по железу. Подозреваю что-то с памятью не то. Подскажите пожалуйста. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...