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

 
 
> KEIL и lwIP, помогите начинающему!
nikkov
сообщение Mar 14 2008, 14:34
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332



Пытаюсь собрать простейший пример для lwIP под LPC2468, столкнулся с непонятной для меня проблемой, которая приведена на рисунке: LDR R0, [R6, #0x10] загружает в регистр не то значение!
Исходный пример был под GCC я его пытаюсь запустить на keil rv mdk 3.15. Сам только осваиваю АРМы, поэтому думаю ответ где-то на поверхности, но где копать пока не знаю. Возможно дело в выравнивании структур?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 22)
aaarrr
сообщение Mar 14 2008, 14:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(nikkov @ Mar 14 2008, 17:34) *
Возможно дело в выравнивании структур?

В нем, родимом. Слово считывается по не выровненному адресу.
Go to the top of the page
 
+Quote Post
nikkov
сообщение Mar 14 2008, 15:00
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 217
Регистрация: 1-02-05
Пользователь №: 2 332



Цитата(aaarrr @ Mar 14 2008, 20:50) *
В нем, родимом. Слово считывается по не выровненному адресу.

Я на PC сталкивался с такой ситуацией когда линковались библиотеки с другими выравниваниями. Но тут то все исходники компилятся в одном проекте, с одними настройками. Как такое возможно? И как победить? Заранее спасибо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 15 2008, 18:54
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Я в свой проект на АРМе внедрял lwip 1.2.0. Скачивал source tarball с домашнего сайта. Может быть, это была ошибка: надо было взять прямо из CVS с нужным тегом, чтобы последние фиксы для багов все были. Сталкивался с проблемой выравнивания, она приводила к ошибкам при передаче данных. Даже нашёл, в каком именно месте это происходило. Вылечил изменением PBUF_LINK_HLEN с 14 на 16 (насколько я понял, вреда нет, просто возможен дополнительный расход памяти и меньше проблем с выравниванием). Ясно, что корень проблемы был глубже, но я понадеялся на то, что в других местах это не проявляется. Не исключено, что в последних версиях это пофиксено. Только в последних версиях вместе с фиксами могут быть и новые баги...
Go to the top of the page
 
+Quote Post
nikkov
сообщение Mar 16 2008, 04:22
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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-ом?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Mar 17 2008, 06:18
Сообщение #6


Знающий
****

Группа: 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)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 17 2008, 09:54
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MALLOY2 @ Mar 17 2008, 09:18) *
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)

Для Keil'a должно быть
Код
#define PACK_STRUCT_START    __packed
Go to the top of the page
 
+Quote Post
nikkov
сообщение Mar 18 2008, 03:15
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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;
}


Как это понимать? Нужно ли последнее слово или нет?
Go to the top of the page
 
+Quote Post
Quasar
сообщение Mar 22 2008, 20:24
Сообщение #9


Местный
***

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



Цитата(nikkov @ Mar 18 2008, 06:15) *
Как это понимать? Нужно ли последнее слово или нет?

Лично я в снифере не наблюдаю ни каких Ethernet CRC, поэтому нужен smile.gif .
Go to the top of the page
 
+Quote Post
Quasar
сообщение Mar 22 2008, 22:02
Сообщение #10


Местный
***

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



Причем я заметил другое, если написать так:

RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) +1;

То на маленьких пингах всё ok. Но если попытаться пропинговать железку пакетами длиной большей чем размер pbuf'ра то перестает сходиться CRC...но проблема судя по всему в EMACе так как RxLen всегда выходит меньше на 1 реального размера пакета.
Если написать:
RxLen = (RX_STAT_INFO(idx) & RINFO_SIZE) +2;
То всё ok. Откуда эта 2 берется...?
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 19 2008, 13:22
Сообщение #11


Частый гость
**

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



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

ссылочку не подбросите? хочется посмотреть реализацию... или, если не жалко, свой проект, можно урезанный
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 20 2008, 09:32
Сообщение #12


Частый гость
**

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



или подскажите, где найти файл lwipweb.zip - пример применения lwip без rtos (Курт с сайта embeddedrelated.com)?
Что-то я не совсем понимаю...
Go to the top of the page
 
+Quote Post
lebiga
сообщение May 21 2008, 10:41
Сообщение #13


Частый гость
**

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



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

нашел сам, в yahoo tech group.
Прикрепленные файлы
Прикрепленный файл  lwIPWeb.zip ( 362.48 килобайт ) Кол-во скачиваний: 242
 
Go to the top of the page
 
+Quote Post
lebiga
сообщение Jun 11 2008, 16:38
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 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 - подпрограмма обработки - там нужна помощь! help.gif
объясните последовательность действий, что и как нужно применять
tcp_connect(), tcp_arg, tcp_recv(), tcp_sent(), tcp_poll()
делал подобно http - не работает
Прикрепленные файлы
Прикрепленный файл  indy_client_server.rar ( 5.19 килобайт ) Кол-во скачиваний: 79
 
Go to the top of the page
 
+Quote Post
VAI
сообщение Jun 12 2008, 08:51
Сообщение #15


Профессионал
*****

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



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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
lebiga
сообщение Jun 12 2008, 10:29
Сообщение #16


Частый гость
**

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



Цитата
объясните последовательность действий, что и как нужно применять
tcp_connect(), tcp_arg, tcp_recv(), tcp_sent(), tcp_poll()


Нашел ОТЛИЧНЫЙ документ!

Small TCP/IP stacks for micro controllers
Прикрепленные файлы
Прикрепленный файл  B_assignment_vanderPloeg.pdf ( 307.6 килобайт ) Кол-во скачиваний: 937
 
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jun 15 2008, 14:05
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 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

smile.gif
Go to the top of the page
 
+Quote Post
lebiga
сообщение Jun 17 2008, 08:38
Сообщение #18


Частый гость
**

Группа: Свой
Сообщений: 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.

Скорее всего оптимизация компилятора, попробуй попереключать, в ИАРе у меня с подобными конструкциями все ок.
Go to the top of the page
 
+Quote Post
Quasar
сообщение Jun 17 2008, 10:44
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 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, ни каких варнингов и глюков smile.gif
Go to the top of the page
 
+Quote Post
mobidev
сообщение Jun 22 2008, 18:00
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 22-06-08
Из: Краснодарский край
Пользователь №: 38 488



Цитата(lebiga @ May 21 2008, 14:41) *
нашел сам, в yahoo tech group.


Собственно можно взять на домашней страница автора Адама Дункеля

http://www.dunkels.com/adam/
http://www.sics.se/~adam/

http://www.sics.se/~adam/software.html
http://www.sics.se/~adam/lwip/
http://www.sics.se/~adam/miniweb/

Ещё есть uIP:
http://www.sics.se/~adam/uip/
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 22 2008, 19:24
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(mobidev @ Jun 22 2008, 20:00) *
Собственно...

Собственно:
http://www.google.com/search?client=opera&...-8&oe=utf-8
Это я к тому, что америку открывать не надо. И уж тем более рассовывать по всем темам дежурные ссылки.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 22 2008, 19:33
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



...да еще мертвые.
Go to the top of the page
 
+Quote Post
mobidev
сообщение Jun 24 2008, 07:59
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 202
Регистрация: 22-06-08
Из: Краснодарский край
Пользователь №: 38 488



Цитата(aaarrr @ Jun 22 2008, 23:33) *
...да еще мертвые.


Почему же мёртвые? Все приведённые ссылки живые.
В своё время пришлось именно uIP использовать на железке, правда тогда это было ещё не на ARM, а на AVR ATmega128.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 18:02
Рейтинг@Mail.ru


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