|
Проблема c IAR |
|
|
|
Sep 15 2011, 17:09
|

Участник

Группа: Участник
Сообщений: 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) Ума не приложу что это за собака в коде и что она значит? П.С. Если что представлю код подробнее, когда буду на работе.
Сообщение отредактировал cyb - Sep 15 2011, 17:10
|
|
|
|
|
Sep 16 2011, 06:45
|

Участник

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

|
Цитата(KRS @ Sep 15 2011, 23:09)  А зачем _PORTA определять? в ioXXX.h для вашего контроллера все есть! Зачем это дело десятое, если бы я программу писал то ничего бы не определял, но программа не моя и была написана лет 5 назад, а мне её нужно дорабатывать. Теперь вот и думаю либо немного исправить этот заголовочный файл, либо перелопачивать весь код, либо дописать на IAR 4.20. Исправить было бы предпочтительнее.
|
|
|
|
|
Sep 16 2011, 07:42
|

Участник

Группа: Участник
Сообщений: 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)
|
|
|
|
|
Sep 16 2011, 08:41
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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", так её нужно поставить...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Sep 16 2011, 09:12
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 16 2011, 09:37
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 16 2011, 09:47
|

Профессионал
    
Группа: Модераторы
Сообщений: 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
|
|
|
|
|
Sep 16 2011, 10:50
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 16 2011, 11:33
|

Профессионал
    
Группа: Модераторы
Сообщений: 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; */
|
|
|
|
|
Sep 16 2011, 12:08
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|