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

 
 
> Проблема c IAR
cyb
сообщение Sep 15 2011, 17:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Здравствуйте. В общем сразу к делу. Перехожу на 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

П.С. Если что представлю код подробнее, когда буду на работе.

Сообщение отредактировал cyb - Sep 15 2011, 17:10
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
KRS
сообщение Sep 15 2011, 20:09
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А зачем _PORTA определять? в ioXXX.h для вашего контроллера все есть!
Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 06:45
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



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

Зачем это дело десятое, если бы я программу писал то ничего бы не определял, но программа не моя и была написана лет 5 назад, а мне её нужно дорабатывать. Теперь вот и думаю либо немного исправить этот заголовочный файл, либо перелопачивать весь код, либо дописать на IAR 4.20. Исправить было бы предпочтительнее.
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 16 2011, 07:05
Сообщение #4


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



1. есть препроцессор
2. посмотрите как в родных ioXXX файлах описаны регистры.
Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 07:42
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Цитата
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)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 16 2011, 08:39
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(cyb @ Sep 15 2011, 21:09) *
Ума не приложу что это за собака в коде и что она значит? cranky.gif
Это такой у ИАР способ объявления переменных (или даже констант) с привязкой к абсолютному адресу.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 16 2011, 08:40
Сообщение #7


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(cyb @ Sep 16 2011, 11:42) *
Ну да посмотрел, но не пойму как заменить такую запись

Напрямую никак, там через union сделано.
Вам надо посмотреть файл iomacro.h, там в комментах должно быть написано как такие макросы раскрываются, возможно в новом компилере чуть по другому.
Я то старый до сих пор использую, и вроде static в данном случае указывать не надо.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 16 2011, 08:41
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(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", так её нужно поставить...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 09:12
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Цитата(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 естественно стоит.

Сообщение отредактировал cyb - Sep 16 2011, 09:13
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Sep 16 2011, 09:35
Сообщение #10


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 09:37
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



В общем идёт так:

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

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

Сообщение отредактировал cyb - Sep 16 2011, 09:39
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 16 2011, 09:47
Сообщение #12


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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)


Сообщение отредактировал KRS - Sep 16 2011, 09:52
Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 10:50
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



Код
__io union {
    struct {
        ..
    } _PORTA;
} @ 0x21;

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

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

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

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

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

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

Это тоесть? Странная какая-то запись. Может вы имели в виду PORTG.2?

Сообщение отредактировал cyb - Sep 16 2011, 10:50
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 16 2011, 11:33
Сообщение #14


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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;
*/


Go to the top of the page
 
+Quote Post
cyb
сообщение Sep 16 2011, 12:08
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 29-08-11
Из: Киев
Пользователь №: 66 910



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

А понятно, в принципе структура с union работает, так что остановлюсь на этом, а то такие многоэтажные макросы как в iomacro.h пока слишком для меня. Спасибо за помощь.

Сообщение отредактировал cyb - Sep 16 2011, 12:09
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 26th July 2025 - 00:49
Рейтинг@Mail.ru


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