Перейти к содержанию
    

Пытаюсь собрать простейший пример для lwIP под LPC2468, столкнулся с непонятной для меня проблемой, которая приведена на рисунке: LDR R0, [R6, #0x10] загружает в регистр не то значение!

Исходный пример был под GCC я его пытаюсь запустить на keil rv mdk 3.15. Сам только осваиваю АРМы, поэтому думаю ответ где-то на поверхности, но где копать пока не знаю. Возможно дело в выравнивании структур?

post-2332-1205505271_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно дело в выравнивании структур?

В нем, родимом. Слово считывается по не выровненному адресу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В нем, родимом. Слово считывается по не выровненному адресу.

Я на PC сталкивался с такой ситуацией когда линковались библиотеки с другими выравниваниями. Но тут то все исходники компилятся в одном проекте, с одними настройками. Как такое возможно? И как победить? Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в свой проект на АРМе внедрял lwip 1.2.0. Скачивал source tarball с домашнего сайта. Может быть, это была ошибка: надо было взять прямо из CVS с нужным тегом, чтобы последние фиксы для багов все были. Сталкивался с проблемой выравнивания, она приводила к ошибкам при передаче данных. Даже нашёл, в каком именно месте это происходило. Вылечил изменением PBUF_LINK_HLEN с 14 на 16 (насколько я понял, вреда нет, просто возможен дополнительный расход памяти и меньше проблем с выравниванием). Ясно, что корень проблемы был глубже, но я понадеялся на то, что в других местах это не проявляется. Не исключено, что в последних версиях это пофиксено. Только в последних версиях вместе с фиксами могут быть и новые баги...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в свой проект на АРМе внедрял lwip 1.2.0. Скачивал source tarball с домашнего сайта. Может быть, это была ошибка: надо было взять прямо из CVS с нужным тегом, чтобы последние фиксы для багов все были. Сталкивался с проблемой выравнивания, она приводила к ошибкам при передаче данных. Даже нашёл, в каком именно месте это происходило. Вылечил изменением PBUF_LINK_HLEN с 14 на 16 (насколько я понял, вреда нет, просто возможен дополнительный расход памяти и меньше проблем с выравниванием). Ясно, что корень проблемы был глубже, но я понадеялся на то, что в других местах это не проявляется. Не исключено, что в последних версиях это пофиксено. Только в последних версиях вместе с фиксами могут быть и новые баги...

Я брал этот проект с конфы по LPC2000. Он должен быть рабочим, но заточен на WinARM GCC компилятор, а мне надо под АРМовый компилятор Кейла. Неужели никто не собирал его под keil-ом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость MALLOY2
Я на 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для 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;

}

 

Как это понимать? Нужно ли последнее слово или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как это понимать? Нужно ли последнее слово или нет?

Лично я в снифере не наблюдаю ни каких Ethernet CRC, поэтому нужен :) .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

То на маленьких пингах всё ok. Но если попытаться пропинговать железку пакетами длиной большей чем размер pbuf'ра то перестает сходиться CRC...но проблема судя по всему в EMACе так как RxLen всегда выходит меньше на 1 реального размера пакета.

Если написать:

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

То всё ok. Откуда эта 2 берется...?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я брал этот проект с конфы по LPC2000. Он должен быть рабочим, но заточен на WinARM GCC компилятор, а мне надо под АРМовый компилятор Кейла. Неужели никто не собирал его под keil-ом?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или подскажите, где найти файл lwipweb.zip - пример применения lwip без rtos (Курт с сайта embeddedrelated.com)?

Что-то я не совсем понимаю...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

или подскажите, где найти файл lwipweb.zip - пример применения lwip без rtos (Курт с сайта embeddedrelated.com)?

Что-то я не совсем понимаю...

нашел сам, в yahoo tech group.

lwIPWeb.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет 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:

объясните последовательность действий, что и как нужно применять

tcp_connect(), tcp_arg, tcp_recv(), tcp_sent(), tcp_poll()

делал подобно http - не работает

indy_client_server.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...