Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F107 + RTL8201 + lwip-1.4.0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2, 3, 4
smk
Как бы мне глянуть что у Вас собралось?
smk
Вот такая ошибка:
Код
Error: L9937E: RL-ARM is not allowed with this license


Разобрался...

Код
  free_mem ((OS_FRAME *)var);


Зачем в конце
Код
void cgi_process_var (U8 *qs)
вышеупомянутое припеисано? Спасибо.
Golikov A.
что-то вы уже сами с собой беседуете%) причем такое чувство что часть беседы проходит мимо нас%)...

так в чем конкретно то загвоздка то?
smk
Прикрутил HTTP_CGI.c и закоментил там многое. Оставил только то, что касается веб-странички из примера в той части где речь идет об IP-адресе и его замене с веб странички. Пытаюсь научиться прикручивать кнопки и окошки. Пока загвоздка в том, что не добавляется network.cgi . Иными словами index.htm я вижу, а при попытке перехода на network.cgi пишет что его нет. тег такой:
Код
<p><a href="/network.cgi">Посмотреть сетевые настройки</a></p>



Опять сам с собой... Если кому интересно, то опять пути. Я скопировал проект чтоб не собирать новый, просто повыкидывал старое и заново подключил новое. Мне и в голову не пришло, что кейл может где-то запомнить полный путь к старому файлу. В свойствах вообще относительный всегда был. Т.е. когда я заново с нуля переподключил Web.inp тогда дело и пошло. Понятно, что в файле inp старого проекта упоминания о новых web небыло.
Теперь о более насущном. На основе файлов примера я таки запустил просмотр сетевых настроек и их редактирование. Однако не все пока понятно. Мне бы хотелось попросить самый простой пример модификации переменной с веб-странички и отображения другой переменной. Интересуют коды как для контроллера так и для сайта. Просто два окошка. В одно вводим и по нажатию кнопки значение уходит в контроллер, а там присваивается. В другом окошке скажем восьмибитная переменная отображается и обновляется скажем 2-3 раза в секунду.
Golikov A.
ну это вам надо уже тему другую чую...

Потому что HTML вам это не даст, тут надо уже PHP подключать. А PHP в свою очередь это надо на арме городить интерпритатор и обработчик данных, и не уверен что это прям на 5 копеек делов.

smk
По ссылке ниже дядька разобрался более-менее, но как-то скромно описал.
Цитата

Мне бы по большому счету найти примеры как правильно задать на страничке кнопку/окошко и где потом это будет отрабатывать в программе (в какой функции что). Что-то уже понятно, но хочется простых примеров в стиле минимализма.
andrewlekar
Кнопка делает Submit на страничку CGI. CGI вызывает функцию из вашей программы. Некоторые веб-сервера для embedded применений имеют SSI (server-side includes) фичу для динамического обновления страницы.
Мне лично не нравится ни CGI, ни SSI, хотя это довольно простые штуки. Я бы сделал сайт на JQuery или просто java script, кнопочка бы делала POST, а веб-сервер обрабатывал бы POST/GET запросы как надо. Про AJAX почитайте например, но там нужен парсер XML. Ничто не мешает выкинуть XML и использовать чё-нить поприличнее.
Golikov A.
http://electronix.ru/forum/index.php?showtopic=117876
поглядите соседняя тема, в последнем сообщении человек привел видео.
Вроде бы как раз то что вам надо. У него там веб интерфейс, числа задает, получает обратно... Судя по уровню вопросов далеко не бог, скорее всего надергал каких то стандартов. Думаю имеет смысл связаться и поспрашать что да как.
Neborak
Добрый день. У меня тоже STM32F107 + RTL8201 (плата от Тэрры ТЕ-STM32F107). Ковыряю их пример Webserver_Demo_uIP (stm32_eth + uip v0.9). Хотел сразу переделать на lwIP, но понял, что с наскока не получится. А проблем в следующем. Создаю UDP соединение, и проваливаясь в UIP_UDP_APP() отправляю каждую секунду UDP пакеты с порядковым номером на ноутбук. На ноутбуке вижу картину: 1, 2, 3, 7, 8, 9, 11... Попробовал уменьшить время до 150мс между пакетами и увеличивать до 5 секунд, но картина примерно одинаковая во всех случаях. Т.е. мое предположение о том, что где-то что-то не успевает не оправдалось. Поставил проверку возвращаемых результатов функцией ETH_HandleTxPkt, она выполняет загрузку сообщения на передачу. Но тут во всех случаях выполнение завершается успешно. Сейчас пока пытаюсь "вручную" создавать и отправлять UDP пакеты мимо стека, что бы убедиться, что стек не виновен и разобраться с железом.
Плата с ноутбуком подключены на прямую, сообщения смотрю WireSharkом.
Буду благодарен за любую подсказку.
Golikov A.
вы видели то ли в этой теме то ли в соседней про LwIP было сказано вот что. В стеке для STM самая самая нижня, железная функция отправки всегда возвращает что все получилось. Там стоит заглушка и приписка что в этом месте можно детектить и индицировать ошибки. Так что проверьте все ваши библиотечные функции, они для STMа не дописаны!
Neborak
Цитата(Golikov A. @ Jan 9 2014, 14:02) *
вы видели то ли в этой теме то ли в соседней про LwIP было сказано вот что. В стеке для STM самая самая нижня, железная функция отправки всегда возвращает что все получилось. Там стоит заглушка и приписка что в этом месте можно детектить и индицировать ошибки. Так что проверьте все ваши библиотечные функции, они для STMа не дописаны!
Спасибо за ответ, я как и писал выше, просмотрел содержимое UDP пакета, создал массив с точно таким же содержимым и подменяю последние 4 символа номером пакета в виде ASCII кода и передаю этот массив функции ETH_HandleTxPkt. То, "на глаз" ничего не пропадает. То есть, похоже проблема в самом стеке, но остался вопрос с библиотекой stm32_eth, потому как данные начинают приходить с номера пакета 3, а 0, 1 и 2 мне не приходят.
Будем копать.
Neborak
Цитата(Neborak @ Jan 9 2014, 14:19) *
Спасибо за ответ, я как и писал выше, просмотрел содержимое UDP пакета, создал массив с точно таким же содержимым и подменяю последние 4 символа номером пакета в виде ASCII кода и передаю этот массив функции ETH_HandleTxPkt. То, "на глаз" ничего не пропадает. То есть, похоже проблема в самом стеке, но остался вопрос с библиотекой stm32_eth, потому как данные начинают приходить с номера пакета 3, а 0, 1 и 2 мне не приходят.
Будем копать.

Удалось не "на глаз", а программными средствами определить, что при отправке пакетов через ETH_HandleTxPkt потерь нет при общем количестве пакетов 100000. Пока не выяснил причину, почему не приходят первые три пакета с номерами 0, 1, 2. Разбираюсь с модулем Ethernet и решил делать поддержку lwIP.
Neborak
Запустил AN3102 (stm32f107 + lwIP), правда, пришлось адаптировать под свою схему и обновить CMSIS. Освоил отправку UDP сообщений и попутно разбирался в железе, интересовал аппаратный расчет контрольных сумм для IP, UDP и TCP пакетов, действительно работает.
Пока не удалось наладить прием пакетов, хотя все и настроено как в части, которая отвечает за tftp.
kolobok0
Цитата(Neborak @ Jan 14 2014, 17:44) *
Запустил AN3102 (stm32f107 + lwIP), правда, пришлось адаптировать под свою схему и обновить CMSIS...


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

Neborak
У меня задача передавать по UDP данные из шины CAN и наоборот при чем с минимальной задержкой. Все ближе подхожу к тому, что бы писать свой UDP/IP стек, но пока настораживает поддержка ARP и IGMP, которые тоже нужно будет реализовать. Или перейти сразу на stm32f407, демоплата есть, но придется повозиться с освоением нового чипа.
kolobok0
Цитата(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;
  }
}


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

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


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


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

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

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

Не избавит, имел ввиду, что если свой UDP реализовать, то ARP и ICMP нужно делать тоже, а в их простоте я пока не уверен.
kolobok0
Цитата(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;  // <= если произошла ошибка при передачи управления другому потоку.
  }
}

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

легче сразу сделать новый сокет с новым портом и новым указателем, а потом старый запустить на закрытие, и он через некоторое время закроется и освободит ресурсы...
smk
В начале 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 A.
int - просто так... напишите чар если хотите или uint8_t так совсем правильно будет...
проц 32 битный, ему что чар что инт одинаково по времени копировать-присваивать, а в некоторых даже быстрее 32 бита, масками резать не надо....

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

tcp_close

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

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

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


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

Тоже возникла такая задача. Только не 3 а 2. Не подскажете как делали? Я пробовал создать 2 с разными обработчиками. Вылетало в ошибку по железу. Подозреваю что-то с памятью не то. Подскажите пожалуйста. Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.