|
KEIL и lwIP, помогите начинающему! |
|
|
|
Mar 14 2008, 14:34
|
Местный
  
Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332

|
Пытаюсь собрать простейший пример для lwIP под LPC2468, столкнулся с непонятной для меня проблемой, которая приведена на рисунке: LDR R0, [R6, #0x10] загружает в регистр не то значение! Исходный пример был под GCC я его пытаюсь запустить на keil rv mdk 3.15. Сам только осваиваю АРМы, поэтому думаю ответ где-то на поверхности, но где копать пока не знаю. Возможно дело в выравнивании структур?
Эскизы прикрепленных изображений
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 22)
|
Mar 14 2008, 15:00
|
Местный
  
Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332

|
Цитата(aaarrr @ Mar 14 2008, 20:50)  В нем, родимом. Слово считывается по не выровненному адресу. Я на PC сталкивался с такой ситуацией когда линковались библиотеки с другими выравниваниями. Но тут то все исходники компилятся в одном проекте, с одними настройками. Как такое возможно? И как победить? Заранее спасибо.
|
|
|
|
|
Mar 15 2008, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Я в свой проект на АРМе внедрял lwip 1.2.0. Скачивал source tarball с домашнего сайта. Может быть, это была ошибка: надо было взять прямо из CVS с нужным тегом, чтобы последние фиксы для багов все были. Сталкивался с проблемой выравнивания, она приводила к ошибкам при передаче данных. Даже нашёл, в каком именно месте это происходило. Вылечил изменением PBUF_LINK_HLEN с 14 на 16 (насколько я понял, вреда нет, просто возможен дополнительный расход памяти и меньше проблем с выравниванием). Ясно, что корень проблемы был глубже, но я понадеялся на то, что в других местах это не проявляется. Не исключено, что в последних версиях это пофиксено. Только в последних версиях вместе с фиксами могут быть и новые баги...
|
|
|
|
|
Mar 16 2008, 04:22
|
Местный
  
Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332

|
Цитата(scifi @ Mar 16 2008, 00:54)  Я в свой проект на АРМе внедрял lwip 1.2.0. Скачивал source tarball с домашнего сайта. Может быть, это была ошибка: надо было взять прямо из CVS с нужным тегом, чтобы последние фиксы для багов все были. Сталкивался с проблемой выравнивания, она приводила к ошибкам при передаче данных. Даже нашёл, в каком именно месте это происходило. Вылечил изменением PBUF_LINK_HLEN с 14 на 16 (насколько я понял, вреда нет, просто возможен дополнительный расход памяти и меньше проблем с выравниванием). Ясно, что корень проблемы был глубже, но я понадеялся на то, что в других местах это не проявляется. Не исключено, что в последних версиях это пофиксено. Только в последних версиях вместе с фиксами могут быть и новые баги... Я брал этот проект с конфы по LPC2000. Он должен быть рабочим, но заточен на WinARM GCC компилятор, а мне надо под АРМовый компилятор Кейла. Неужели никто не собирал его под keil-ом?
|
|
|
|
|
Mar 17 2008, 06:18
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Я на PC сталкивался с такой ситуацией когда линковались библиотеки с другими выравниваниями. Но тут то все исходники компилятся в одном проекте, с одними настройками. Как такое возможно? И как победить? Заранее спасибо. ARM компиляторы по умолчанию применяют выравнивание на границу 4 байтов (32 бит). Для этого у LWIP обьявлены дефайны #define PACK_STRUCT_STRUCT #define PACK_STRUCT_END #define PACK_STRUCT_FIELD(x) x вы должны их заменить на дерективы вышего компилятора которые заставят создавать структуры с выравниванием к 1 байту. P.S. я незнаю как в KEIL в IAR это #pragma pack(1)
|
|
|
|
|
Mar 18 2008, 03:15
|
Местный
  
Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332

|
Цитата(aaarrr @ Mar 17 2008, 15:54)  Для Keil'a должно быть Код #define PACK_STRUCT_START __packed Спасибо, помогло. Правда не PACK_STRUCT_START, а PACK_STRUCT_BEGIN, но это не важно. Теперь столкнулся со следующей проблемой: при приеме ICMP пакета из EMAC читается длина на 4 байта меньше реального размера пакета. При увеличении длины на 4 байта под отладчиком весь пакет из EMAC-а вычитывается правильно и отвечает на пинг. Никто с таким не сталкивался? вот что вычитал: Цитата > I was just going through the FreeRTOS LPC2368 Webserver Demo. There is > just one small thing that's been bugging me...in "emac.c", in function > "StartReadFrame()", there is the following statement: > > RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) - 3; > > Since the "RxSize" field in RX status info is "actual RX size - 1", > subtracting "3" from this field would make RxLen equal to "actual RX > size - 4 ". So that means in the end 4 bytes less frame data will be > stored, why is that so? Or am I interpreting it wrong here... > The last four bytes contain the Ethernet CRC, which is not passed to the TCP/IP stack so are left to languish in the buffer. но тогда срабатывает этот код в lwIP: Цитата if (inet_chksum_pbuf(p) != 0) { LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); pbuf_free(p); ICMP_STATS_INC(icmp.chkerr); snmp_inc_icmpinerrors(); return; } Как это понимать? Нужно ли последнее слово или нет?
|
|
|
|
|
May 19 2008, 13:22
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Цитата(nikkov @ Mar 16 2008, 08:22)  Я брал этот проект с конфы по LPC2000. Он должен быть рабочим, но заточен на WinARM GCC компилятор, а мне надо под АРМовый компилятор Кейла. Неужели никто не собирал его под keil-ом? ссылочку не подбросите? хочется посмотреть реализацию... или, если не жалко, свой проект, можно урезанный
|
|
|
|
|
May 21 2008, 10:41
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Цитата(lebiga @ May 20 2008, 13:32)  или подскажите, где найти файл lwipweb.zip - пример применения lwip без rtos (Курт с сайта embeddedrelated.com)? Что-то я не совсем понимаю... нашел сам, в yahoo tech group.
|
|
|
|
|
Jun 11 2008, 16:38
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Насчет LWIP и выравнивания, LPC2368!Сам просидел два дня, пока нашел в многих include LWIPа описано #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/bpstruct.h" #endif описание структуры (заголовка) #ifdef PACK_STRUCT_USE_INCLUDES # include "arch/epstruct.h" #endif достаточно в lwipopt.h указать параметр #define PACK_STRUCT_USE_INCLUDES 1 и сделать bpstruct.h со строкой #pragma pack(1) - это для иара, для Кейла packed epstruct.h - #pragma pack() поместить в каталог arch - и проблемы с выравниванием ушли. Сейчас сижу - не могу прикрутить LWIP к INDY в DELPHI пример Вasic TCP Client в инди синхронизируется c моим устройством (посылает SYN, получает SYN+ASK, посылает ASK - и я молчу, не знаю что ответить) Записал протоколы обмена между двумя компами с примерами TCP CLIENT и TCP SERVER в файлы ниже там после ASK идет пакет с текстом приветствия и данными Вот мой код в LPC - открываю соединение static void leb_init(void) { struct tcp_pcb* tcpleb; struct tcp_pcb* tcpleb_listen; tcpleb = tcp_new(); if (tcpleb == NULL) return; /* Bind to port 3333 for any address */ if (tcp_bind(tcpleb, IP_ADDR_ANY, 3333) != ERR_OK) return; tcpleb_listen = tcp_listen(tcpleb); if (tcpleb_listen == NULL) { tcp_abort(tcpleb); tcpleb = NULL; return; } tcpleb = tcpleb_listen; tcp_accept(tcpleb, lebiga_accept_callback); } lebiga_accept_callback - подпрограмма обработки - там нужна помощь! объясните последовательность действий, что и как нужно применять tcp_connect(), tcp_arg, tcp_recv(), tcp_sent(), tcp_poll() делал подобно http - не работает
|
|
|
|
|
Jun 12 2008, 08:51
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Кстати, сейчас коллега активно работает с последнис кейлом (МДК 3.22а), так он говорит, там #pragma pack работает, специально, говорит, проверял размеры передаваемых структур и т.д., т.к. в документации на компилятор пока ничего про это нет. Его контроллер общается с разными другими железками, у которых и #pragma pack( 1 ) и #pragma pack( 2 ) и #pragma pack( 4 ) установлены. Данные передаются и принимаются корректно.
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Jun 12 2008, 10:29
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Цитата объясните последовательность действий, что и как нужно применять tcp_connect(), tcp_arg, tcp_recv(), tcp_sent(), tcp_poll() Нашел ОТЛИЧНЫЙ документ! Small TCP/IP stacks for micro controllers
|
|
|
|
|
Jun 15 2008, 14:05
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
А у меня какие-то проблемы возникли при сборке с DHCP, линкер выдает кучу каких-то варнингов, типа вот таких вот: Код *** WARNING L25: DATA TYPES DIFFERENT SYMBOL: etharp_arp_input MODULE: .\ethernetif.obj (ethernetif) DEFINED: .\etharp.obj (etharp) Всё правда нормально работает, но не приятно. Хотя с домашним роутером железка почему-то не может договорится (роутер просто не отвечает), но например с DHCP установленном на Win машине, всё работает замечательно. Пока собирал, столкнулся с глюками компилятора по всей видимости, например: В tcp_in.c: Код seqno = tcphdr->seqno = ntohl(tcphdr->seqno); ackno = tcphdr->ackno = ntohl(tcphdr->ackno); Не работает, в seqno и ackno пишется хрень, если заменить на: Код tcphdr->seqno = ntohl(tcphdr->seqno); tcphdr->ackno = ntohl(tcphdr->ackno); seqno = tcphdr->seqno; ackno = tcphdr->ackno; То всё Ok. В dhcp.c: Код if (reply_msg->op != DHCP_BOOTREPLY) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | 1, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op)); goto free_pbuf_and_return; } Вообще не собирается, пишет какая-то там internal error... Вот так, всё работает Ok: Код i=reply_msg->op; if (i != DHCP_BOOTREPLY) { LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | 1, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op)); goto free_pbuf_and_return; } Версия такая: Цитата µVision3 V3.34 Tool Version Numbers: C Compiler: CA.Exe V2.00f Assembler: AA.Exe V2.00 Linker/Locator: LA.Exe V2.01e
|
|
|
|
|
Jun 17 2008, 08:38
|

Частый гость
 
Группа: Свой
Сообщений: 163
Регистрация: 22-06-06
Из: Киев
Пользователь №: 18 292

|
Цитата(Quasar @ Jun 15 2008, 18:05)  Хотя с домашним роутером железка почему-то не может договорится (роутер просто не отвечает), но например с DHCP установленном на Win машине, всё работает замечательно. А если выдернуть и вставить кабель на роутере - работает? Или предварительно снести таблице arp (arp -d) ? Цитата Пока собирал, столкнулся с глюками компилятора по всей видимости, например: Я использую ИАР, 5.10 и к меня подобных ворнингов нет Цитата В tcp_in.c: Код seqno = tcphdr->seqno = ntohl(tcphdr->seqno); ackno = tcphdr->ackno = ntohl(tcphdr->ackno); Не работает, в seqno и ackno пишется хрень, если заменить на: Код tcphdr->seqno = ntohl(tcphdr->seqno); tcphdr->ackno = ntohl(tcphdr->ackno); seqno = tcphdr->seqno; ackno = tcphdr->ackno; То всё Ok. Скорее всего оптимизация компилятора, попробуй попереключать, в ИАРе у меня с подобными конструкциями все ок.
|
|
|
|
|
Jun 17 2008, 10:44
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(lebiga @ Jun 17 2008, 12:38)  А если выдернуть и вставить кабель на роутере - работает? Или предварительно снести таблице arp (arp -d) ? А что её чистить, DHCP discover широковещательный, вообщем-то это здесь непричем, скорее всего запрос какой-то не такой... Цитата(lebiga @ Jun 17 2008, 12:38)  Я использую ИАР, 5.10 и к меня подобных ворнингов нет
Скорее всего оптимизация компилятора, попробуй попереключать, в ИАРе у меня с подобными конструкциями все ок. Собрал под последним RealView, теперь тоже все Ok, ни каких варнингов и глюков
|
|
|
|
|
Jun 24 2008, 07:59
|
Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 22-06-08
Из: Краснодарский край
Пользователь №: 38 488

|
Цитата(aaarrr @ Jun 22 2008, 23:33)  ...да еще мертвые. Почему же мёртвые? Все приведённые ссылки живые. В своё время пришлось именно uIP использовать на железке, правда тогда это было ещё не на ARM, а на AVR ATmega128.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|