Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема c IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
cyb
Здравствуйте. В общем сразу к делу. Перехожу на IAR под AVR и задача доработать программу, которая написана на IDE IAR 4.20. Открываю проект в IAR 5.51 пробую компилировать, но линковщик выдает ошибку [e46]. Причём проект компилируется в старом IAR 4.20 без ошибок. Так вот, как нужно изменить код чтобы он линковался без ошибок в новом IARe?
Код:

...
static __io struct
{
..
} _PORTA @ 0x21;

Ругается так:
Error [e46]: Undefined external reference _PORTA (../../../xxx.d90)

Ума не приложу что это за собака в коде и что она значит? cranky.gif

П.С. Если что представлю код подробнее, когда буду на работе.
KRS
А зачем _PORTA определять? в ioXXX.h для вашего контроллера все есть!
cyb
Цитата(KRS @ Sep 15 2011, 23:09) *
А зачем _PORTA определять? в ioXXX.h для вашего контроллера все есть!

Зачем это дело десятое, если бы я программу писал то ничего бы не определял, но программа не моя и была написана лет 5 назад, а мне её нужно дорабатывать. Теперь вот и думаю либо немного исправить этот заголовочный файл, либо перелопачивать весь код, либо дописать на IAR 4.20. Исправить было бы предпочтительнее.
KRS
1. есть препроцессор
2. посмотрите как в родных ioXXX файлах описаны регистры.
cyb
Цитата
1. есть препроцессор
2. посмотрите как в родных ioXXX файлах описаны регистры.

Ну да посмотрел, но не пойму как заменить такую запись

static volatile __io struct
{
BYTE _P0:1, _P1:1, _P2:1, _P3:1, _P4:1, _P5:1, _P6:1, _P7:1;
} _PING @ 0x63;

такой как в ioxxx.h

SFR_B_N(0x63, PING, Dummy7, Dummy6, Dummy5, PING4, PING3, PING2, PING1, PING0)
demiurg_spb
Цитата(cyb @ Sep 15 2011, 21:09) *
Ума не приложу что это за собака в коде и что она значит? cranky.gif
Это такой у ИАР способ объявления переменных (или даже констант) с привязкой к абсолютному адресу.
KRS
Цитата(cyb @ Sep 16 2011, 11:42) *
Ну да посмотрел, но не пойму как заменить такую запись

Напрямую никак, там через union сделано.
Вам надо посмотреть файл iomacro.h, там в комментах должно быть написано как такие макросы раскрываются, возможно в новом компилере чуть по другому.
Я то старый до сих пор использую, и вроде static в данном случае указывать не надо.
demiurg_spb
Цитата(cyb @ Sep 16 2011, 11:42) *
Ну да посмотрел, но не пойму как заменить такую запись...
Вам нужно определить имя порта с подчёркиванием?

Тогда так наверное:
Код
SFR_B_N(0x63, _PING, Dummy7, Dummy6, Dummy5, PING4, PING3, PING2, PING1, PING0)
или так
Код
#define _PING PING

Да, там ещё в настройках есть галочка типа "Enable SFR defs", так её нужно поставить...
cyb
Цитата(demiurg_spb @ Sep 16 2011, 11:41) *
Вам нужно определить имя порта с подчёркиванием?

Тогда так наверное:
Код
SFR_B_N(0x63, _PING, Dummy7, Dummy6, Dummy5, PING4, PING3, PING2, PING1, PING0)
или так
Код
#define _PING PING

Да, там ещё в настройках есть галочка типа "Enable SFR defs", так её нужно поставить...


Нет, не помогло. Вообще всё это нужно для красоты как я понял, далее по программе есть такие определения например:

#define SYNC_O _PORTA._P6
#define SYNC_I _PINA._P6
#define SYNC_C _DDRA._P6
#define SYNC_M (1 << P6)

Галочка на Enable SFR defs естественно стоит.
demiurg_spb
Тогда проще по тексту программы убрать все эти убогие подчёркивания. ИМХО.
cyb
В общем идёт так:

В заголовке определяется:

static volatile __io struct
{
BYTE _P0:1, _P1:1, _P2:1, _P3:1, _P4:1, _P5:1, _P6:1, _P7:1;
} _PING @ 0x63;

Далее переопределяется в другом заголовке так:

#define ADCDOUT2_O _PORTG.P2
#define ADCDOUT2_I _PING.P2
#define ADCDOUT2_C _DDRG.P2
#define ADCDOUT2_M (1 << P2)

А используется в исходниках так

if(ADCDOUT0_I) _Bytes[0] |= 0x80;
if(ADCDOUT1_I) _Bytes[1] |= 0x80;
if(ADCDOUT2_I) _Bytes[2] |= 0x80;


Цитата
Тогда проще по тексту программы убрать все эти убогие подчёркивания. ИМХО.


Ну вот я и попробовал сделать так:
#define ADCDOUT2_O PORTG.P2
#define ADCDOUT2_I PING.P2
#define ADCDOUT2_C DDRG.P2
#define ADCDOUT2_M (1 << P2)


Но компилятор засыпал ошибками на таких условиях
if(ADCDOUT2_I) _Bytes[2] |= 0x80;
Error[Pe133]: expected a member name D:\WORK\PROJECTS\KP01\CybVe_newIAR\TAD7714.cpp 28
KRS
Цитата(cyb @ Sep 15 2011, 21:09) *
static __io struct
{
..
} _PORTA @ 0x21;

Ругается так:
Error [e46]: Undefined external reference _PORTA (../../../xxx.d90)


Посмотрел я новый iomacro, там тоже самое!
попробуйте static убрать! должно работать.
либо добавить обертку
Код
__io union {
    struct {
        ..
    } _PORTA;
} @ 0x21;



Код
#define SYNC_O _PORTA._P6

можно и эти #define заменить.


Цитата(cyb @ Sep 16 2011, 13:37) *
В общем идёт так:

В заголовке определяется:

static volatile __io struct
{
BYTE _P0:1, _P1:1, _P2:1, _P3:1, _P4:1, _P5:1, _P6:1, _P7:1;
} _PING @ 0x63;

Далее переопределяется в другом заголовке так:

#define ADCDOUT2_O _PORTG.P2
#define ADCDOUT2_I _PING.P2
#define ADCDOUT2_C _DDRG.P2
#define ADCDOUT2_M (1 << P2)


а где подчеркивания? должно быть
#define ADCDOUT2_O _PORTG._P2

Цитата(cyb @ Sep 16 2011, 13:37) *
Ну вот я и попробовал сделать так:
#define ADCDOUT2_O PORTG.P2
#define ADCDOUT2_I PING.P2
#define ADCDOUT2_C DDRG.P2
#define ADCDOUT2_M (1 << P2)


Но компилятор засыпал ошибками на таких условиях
if(ADCDOUT2_I) _Bytes[2] |= 0x80;
Error[Pe133]: expected a member name D:\WORK\PROJECTS\KP01\CybVe_newIAR\TAD7714.cpp 28

нужно PORTG_PORTG2 и т.п.


и не понятно что значит
(1 << P2)
cyb
Код
__io union {
    struct {
        ..
    } _PORTA;
} @ 0x21;

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

Цитата
а где подчеркивания? должно быть
#define ADCDOUT2_O _PORTG._P2

Да правильно это просто я здесь опечатался.

Цитата
и не понятно что значит
(1 << P2)

Что это понятно, а вот как тут используется непонятно.

Цитата
нужно PORTG_PORTG2 и т.п.

Это тоесть? Странная какая-то запись. Может вы имели в виду PORTG.2?
KRS
Цитата(cyb @ Sep 16 2011, 14:50) *
Это тоесть? Странная какая-то запись. Может вы имели в виду PORTG.2?

Нет, я имел ввиду
PORTG_PORTG2
так раскрывается макрос, пример можете посмотреть в файле iomacro.h

Код
/*
  SFR_B_N(0x3F,SREG,I,T,H,S,V,N,Z,C) Expands to:
  __io union {
              unsigned char   SREG;          // The sfrb as 1 byte
              struct {                        // The sfrb as 8 bits
                      unsigned char SREG_Bit0:1,
                                    SREG_Bit1:1,
                                    SREG_Bit2:1,
                                    SREG_Bit3:1,
                                    SREG_Bit4:1,
                                    SREG_Bit5:1,
                                    SREG_Bit6:1,
                                    SREG_Bit7:1;
                     };
              struct {                        // The sfrb as 8 bits
                      unsigned char SREG_C:1,
                                    SREG_Z:1,
                                    SREG_N:1,
                                    SREG_V:1,
                                    SREG_S:1,
                                    SREG_H:1,
                                    SREG_T:1,
                                    SREG_I:1;
                     };
             } @ 0x3F;
*/


cyb
Цитата(KRS @ Sep 16 2011, 14:33) *
Нет, я имел ввиду
PORTG_PORTG2
так раскрывается макрос, пример можете посмотреть в файле iomacro.h

А понятно, в принципе структура с union работает, так что остановлюсь на этом, а то такие многоэтажные макросы как в iomacro.h пока слишком для меня. Спасибо за помощь.
cyb
Хм, в общем переопределил все имена в новом иаре, но вылезла странная ошибка линковщика:
Error[e24]: Segment ABSOLUTE (seg part no 2, symbol "_A_PORTE" in module "TDevice", address [23-23]) overlaps
segment ABSOLUTE (seg part no 11, symbol "_A__PORTE" in module "TDevice", address [23-23])

Кто-нибудь с подобным сталкивался?
KRS
Цитата(cyb @ Sep 23 2011, 15:15) *
_A_PORTE" in module "TDevice", address [23-23]) overlaps
_A__PORTE" in module "TDevice", address [23-23])

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