Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: extern struct in KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Chechelnitsky
Пытаюсь скомпилировать opentcp-arm7-src.zip. Возникла проблема с объявлением глобальной структуры.

Подскажите пожалуйста, а то совсем замучался. Методом тыка нашел комбинацию, которая приемлема для файла main.c, но ошибка возникает в файле tcp.c

Листинг приведен ниже. Компилятор KEIL.

---------------------------------------------------------------------------------------------
file: datatypes.h
---------------------------------------------------------------------------------------------

#ifndef INCLUDE_DATATYPES_H
#define INCLUDE_DATATYPES_H

struct localmach {
int localip;
char localHW[6];
int defgw;
int netmask;
};

typedef struct localmach localmachine_t;

#endif //INCLUDE_DATATYPES_H

---------------------------------------------------------------------------------------------
file: main.c
---------------------------------------------------------------------------------------------

#include "datatypes.h"

localmachine_t localmachine;

int main (void)
{

localmachine.localHW[0] = 0x11;
localmachine.localHW[1] = 0x22;
localmachine.localHW[2] = 0x33;
localmachine.localHW[3] = 0x44;
localmachine.localHW[4] = 0x55;
localmachine.localHW[5] = 0x66;

while (1)
{

}

}

---------------------------------------------------------------------------------------------
file: tcp.c
---------------------------------------------------------------------------------------------

#include "datatypes.h"

extern localmachine_t localmachine;
^^^^^^^^^^^^^^^^^^^^^^^^^^
........

Ошибка: "TCP.C(124): error C53: redefinition of 'localmachine': different compound types"

Это особенность Keil? Или я делаю что-то не так?
DPL
Цитата(Chechelnitsky @ Oct 27 2004, 10:06 PM)
Это особенность Keil? Или я делаю что-то не так?

Да нет, все похоже на правду. Интереса ради попробовал пропустить приведенную в сообщении конструкцию через три разных компилятора (Keil C51, Keil C166, Multi 4) - как и следовало ожидать, все компилируется без ошибок. К сожалению, кейловского компилятора ARM у меня нет.

Возможно, приемлемым окажется такое описание структуры:

---------------------------------------------------------------------------------------------
file: datatypes.h
---------------------------------------------------------------------------------------------

#ifndef INCLUDE_DATATYPES_H
#define INCLUDE_DATATYPES_H

typedef struct {
int localip;
char localHW[6];
int defgw;
int netmask;
} localmachine_t;


#endif //INCLUDE_DATATYPES_H

Это, конечно, уже пляски с бубном, но, возможно, такой вариант компилятору понравится.
NickB
ИМХО компилятор Keil ARM несколько сыроват. Несмотря на их заверения.
А вот ADS- хорош
Chechelnitsky
Попробовал в dkarm-1.4 скомпилировать не чужой, а свой проект - все заработало.

Спасибо за ответы.
Chechelnitsky
В Keil все хорошо. Среда разработки начинается нравиться, но есть непонятное:

Как изменить значение переменной при отладке?
DPL
Цитата(Chechelnitsky @ Nov 1 2004, 10:59 PM)
Как изменить значение переменной при отладке?

Не знаю, как для ARM, но, скорее всего, как и для других семейств:

1. В режиме отладки открыть окно просмотра значений переменных (в меню "View | Watch & Call Stack Window")

2. Если переменная локальная, она уже будет в этом окне на вкладке "Local", иначе - добавить ее на вкладках "Watch 1" или "Watch 2".

3. Щелкнуть мышкой на значении переменной, нажать "F2" или щелкнуть еще раз, после чего присвоить ей требуемое значение.

PS. А что касается самой среды - действительно, очень удобно (использовал для MCS51 и C166). Особенно подкупает вполне адекватная симуляция периферии.
ALexx
Цитата(DPL @ Nov 3 2004, 10:57 AM)
Не знаю, как для ARM, но, скорее всего, как и для других семейств:
1...
2...
3...

Все значительно проще:
В окне Output Window в поле со знаком ">" набрать имя переменной, "=", значение переменной (например RxChar=0x35) и нажать Enter.

P.S. А вот насчет среды Вас поддерживаю на все 100. Дедушка кейл - рулез форевер! smile.gif
alho
Поддерживаю ! Keil - то что надо ! Всем хорош !
DPL
Цитата(ALexx @ Nov 3 2004, 03:43 PM)
Все значительно проще:
В окне Output Window в поле со знаком ">" набрать имя переменной, "=", значение переменной (например RxChar=0x35) и нажать Enter.

To ALexx:
Забыл, забыл... smile.gif
Я этот способ использую в скриптах инициализации, чтобы задать нужные значения на входах и загрузить что нужно в память. А в процессе отладки мне кажется более удобным использовать "Watch window" (хотя это, конечно, дело вкуса).
jojo
Да, исходники OpenTCP надо местами переписать. А то многовато забот при переносе на другие процессоры. Сам сталкивался с тем, что некоторые конструкции разными компиляторами воспринимаются парадоксально. Например, sdcc косвенный вызов функций понимает превратно.

Если у кого есть идеи - не стесняйтесь отправлять их в форум или по почте.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.