реклама на сайте
подробности

 
 
12 страниц V  « < 10 11 12  
Reply to this topicStart new topic
> STM32F107 + RTL8201 + lwip-1.4.0, драйвер PHY для lwip
kolobok0
сообщение Jan 15 2014, 10:06
Сообщение #166


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Neborak @ Jan 15 2014, 11:48) *
..UDP данные из шины CAN..писать свой UDP/IP стек,..поддержка ARP и IGMP, которые тоже нужно будет реализовать.


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

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

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

ЗЫ
по поводу индусии sm.gif)) я долго медитировал, чего хотелось... даже выдрал написанную логику. оставлю без коментариев... это песня...
причём проверил специально последнии две версии стэка 1.4.0, 1.4.1 - такая же фигня. тащат ошибки как гири на ногах...

Код
static uint8_t A;

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


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

Сообщение отредактировал kolobok0 - Jan 15 2014, 10:15
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jan 15 2014, 17:50
Сообщение #167


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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


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


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

Go to the top of the page
 
+Quote Post
Neborak
сообщение Jan 15 2014, 19:48
Сообщение #168


Участник
*

Группа: Участник
Сообщений: 33
Регистрация: 13-04-09
Пользователь №: 47 609



Цитата(Golikov A. @ Jan 15 2014, 21:50) *
а как переход на stm32f407 упростит жизнь

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

Не избавит, имел ввиду, что если свой UDP реализовать, то ARP и ICMP нужно делать тоже, а в их простоте я пока не уверен.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 15 2014, 21:31
Сообщение #169


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Golikov A. @ Jan 15 2014, 21:50) *
...
сохранили состояние А, сделали его единицей.
что-то поделали, и вернули его исходное состояние...
...


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

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

Код
static uint8_t A;


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

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

Go to the top of the page
 
+Quote Post
smk
сообщение Apr 25 2014, 09:28
Сообщение #170


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 25 2014, 11:19
Сообщение #171


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

легче сразу сделать новый сокет с новым портом и новым указателем, а потом старый запустить на закрытие, и он через некоторое время закроется и освободит ресурсы...
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 25 2014, 11:22
Сообщение #172


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



В начале 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

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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 25 2014, 12:16
Сообщение #173


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

tcp_close

кстати для смены IP надо его просто подменить и все, даже перегружать ничего не надо...
Go to the top of the page
 
+Quote Post
smk
сообщение Apr 25 2014, 14:47
Сообщение #174


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение May 4 2014, 05:56
Сообщение #175


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 4 2014, 06:21
Сообщение #176


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

Сетевые настройки подставляются сразу по изменению. То есть если вы меняете IP, маску, или что-то, то как только вы это сделали стэк сразу начинает работать на новых настройках.
Последовательность такая
задаете нулевые настройки (IP = 0.0.0.0)
запускаете DHCP
ждете результатов его работы, если IP не меняется, не становиться не нулевым
выключаете DHCP
задаете IP из флэшки

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


Go to the top of the page
 
+Quote Post
smk
сообщение Nov 9 2017, 18:05
Сообщение #177


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(Golikov A. @ Dec 5 2013, 20:41) *
у меня 3 сокета в проекте, на каждом свой тип данных.

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


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

12 страниц V  « < 10 11 12
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016