kolobok0 0 15 января, 2014 Опубликовано 15 января, 2014 (изменено) · Жалоба ..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; } } ЗЫ ЗЫ это в принципе не совсем трабловый - так, немного курьёзный кусок. а вот если не будет лень - потом выложу уже более серъёзный трабл - с потенциальной утечкой памяти (при не стандартном трафике в сети). Изменено 15 января, 2014 пользователем kolobok0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба а чего плохого в этом куске? сохранили состояние А, сделали его единицей. что-то поделали, и вернули его исходное состояние... стандартный симафорчик, или я что-то упускаю? а как переход на stm32f407 упростит жизнь и избавит от ARP и IGMP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Neborak 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба а как переход на stm32f407 упростит жизнь У stm32f407 тактовая 168 МГц и ноль циклов ожидания против 72 МГц и 2 циклов ожидания у stm32f107. и избавит от ARP и IGMP? Не избавит, имел ввиду, что если свой UDP реализовать, то ARP и ICMP нужно делать тоже, а в их простоте я пока не уверен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 15 января, 2014 Опубликовано 15 января, 2014 · Жалоба ... сохранили состояние А, сделали его единицей. что-то поделали, и вернули его исходное состояние... ... мдя, судя по приведённому коду - вполне может было бы и быть место, но если развернуть бла-бла-бла то картина как то не совсем та: в данном месте идёт вызов выполнения функции Xru в контексте другого потока. В начале этой функции (перед собственно циклом выполняющего основную работу) сбрасывается этот "семафорчик". Т.е. следуя этой логике - семафорчик только на саму передачу управления(не блокируя вызывающий поток) другому потоку. т.е. если список достаточно длинный, то могут запуститься две и более функций. кхм. ышо более кучерявей... static uint8_t A; Xru() { A = 0; // <= сбрасываем при входе в функцию // for (...) { тут работа со списком. освобождаем память, возвращая в пул использования } } foo() { uint8_t B = A; A = 1; // if (!B) { передача на выполнение в контексте другого потока функции Xru(). не блокирующий вызов. A = 0; // <= если произошла ошибка при передачи управления другому потоку. } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 25 апреля, 2014 Опубликовано 25 апреля, 2014 · Жалоба Использую стек Кейла. Чтобы изменить номер порта, как я понимаю нужно пересоздать сокет? Это както можно без перезагрузки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 апреля, 2014 Опубликовано 25 апреля, 2014 · Жалоба закрыть старый сокет, и открыть новый, перезагрузка то зачем? сокет закрывается двойным close, а потом еще подождать. легче сразу сделать новый сокет с новым портом и новым указателем, а потом старый запустить на закрытие, и он через некоторое время закроется и освободит ресурсы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 25 апреля, 2014 Опубликовано 25 апреля, 2014 · Жалоба В начале 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 что-то не совсем понимаю. как это двойным? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 апреля, 2014 Опубликовано 25 апреля, 2014 · Жалоба int - просто так... напишите чар если хотите или uint8_t так совсем правильно будет... проц 32 битный, ему что чар что инт одинаково по времени копировать-присваивать, а в некоторых даже быстрее 32 бита, масками резать не надо.... если вы сокету вызовите close, то незаконекченый закроется, а законекченный разорвет соединение и перейдет в листен моде, потому и надо вызывать клоуз 2 раза, чтобы точно все закрыть. Собственно об этом и написано в документации, которую стоит почитать... tcp_close кстати для смены IP надо его просто подменить и все, даже перегружать ничего не надо... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 25 апреля, 2014 Опубликовано 25 апреля, 2014 · Жалоба Про int я спросил потому что сталкивался с проблемами если не приводить тип явно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 4 мая, 2014 Опубликовано 4 мая, 2014 · Жалоба Во первых int таки ообосновано там стоит. Расчет на широкий круг пользователей так сказать. Теперь вопрос по tcp_close. Если например, я всегда буду вызывать два раза не разбирая состояние сокета, то не будет ли это ошибкой? И еще такой вопрос. На каком-то этапе происходит подстановка дефолтных сетевых настроек. Как мне правильно и в какой момент подставлять настройки, сохраненные в еерrom так чтобы инициализация при старте происходила с сохраненными настройками, а не с дефолтными? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 4 мая, 2014 Опубликовано 4 мая, 2014 · Жалоба если вызывать close 2 раза сокет закроется, в некоторых случаях клоуз вернет код ошибки, но никаких фатальных экцепщинов не будет. Уточните в инструкции, там есть как раз про двойной вызов клоуза, возможно нужна пауза или событие обработки стэка между ними. Поищите по tcp_close. Сетевые настройки подставляются сразу по изменению. То есть если вы меняете IP, маску, или что-то, то как только вы это сделали стэк сразу начинает работать на новых настройках. Последовательность такая задаете нулевые настройки (IP = 0.0.0.0) запускаете DHCP ждете результатов его работы, если IP не меняется, не становиться не нулевым выключаете DHCP задаете IP из флэшки номер порта применяется при создании сокета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 9 ноября, 2017 Опубликовано 9 ноября, 2017 · Жалоба у меня 3 сокета в проекте, на каждом свой тип данных. Тоже возникла такая задача. Только не 3 а 2. Не подскажете как делали? Я пробовал создать 2 с разными обработчиками. Вылетало в ошибку по железу. Подозреваю что-то с памятью не то. Подскажите пожалуйста. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться