Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: unexpected REGDEF
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AndreyVN
Всем привет!

Вот такая ошибка (CVAVR 2.03.4):
Цитата
Error: D:\Atmega\DAC\acquis1.asm(1217) syntax error, unexpected REGDEF


Вот фрагмент кода:
Цитата
char Sector[513];
char *adr_sector;
....
adr_sector = &Sector[0];
...
#asm
...
ldi R26,LOW(_adr_sector) ; <-Ругается на эту строку.
ldi R27,HIGH(_adr_sector);
...
#endasm


Самое интересное, что я такой конструкцией уже пользовался, вроде, все было нормально. Что могла случиться?
VladimirYU
Цитата(AndreyVN @ Feb 21 2009, 12:08) *
Всем привет!

Вот такая ошибка (CVAVR 2.03.4):


Вот фрагмент кода:


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

А если просто

ldi R26,LOW(Sector) ;
ldi R27,HIGH(Sector);

Не пробовали? CVAVR вещь в себе.
AndreyVN
Цитата(VladimirYU @ Feb 21 2009, 13:32) *
А если просто
....
Не пробовали? CVAVR вещь в себе.

То же самое получается.

Приблизительно понял, что происходит. Иногда компилятор присваивает имя переменной на которую я ссылаюсь в ассемблерном коде:
Цитата
;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS
.DEF _adr_sector=R3

В этом случае возникает ошибка.

А иногда, никаких DEF'ов не делает, тогда все компилируется нормально. Как с этим бороться, пока не знаю.
Nick_Shl
Цитата(AndreyVN @ Feb 23 2009, 07:57) *
А иногда, никаких DEF'ов не делает, тогда все компилируется нормально. Как с этим бороться, пока не знаю.
Очень просто: нужно читать документацию!

Компилятор оптимизирует код. Если на этапе компиляции получается так, что переменную можно засунуть в регистр - он так и делает, потому как это ускорит выполнение. А тут вы со своим кодом... Вобщем нужно заставить компилятор переменную положить в память.
Открываем "Help -> CodeVisionAVR C Compiler Reference-> Variables" и читаем: The volatile modifier must be used in order to prevent a variable to be allocated to registers and to warn the compiler that it may be subject to outside change during evaluation.

Вывод: объявлением переменной нужно добавить volatile. Вот так:
Код
volatile char *adr_sector;
aesok
Цитата(Nick_Shl @ Feb 23 2009, 22:10) *
Вывод: объявлением переменной нужно добавить volatile. Вот так:
Код
volatile char *adr_sector;


В данном случае должно быть:
Код
char * volatile adr_sector;


Анатолий.
Nick_Shl
Цитата(aesok @ Feb 23 2009, 21:40) *
В данном случае должно быть:
Код
char * volatile adr_sector;
Ну в AVR'овском асме я не силен, так что с первого раза сложно понять что же хотят загрузить - адрес переменной указателя, или адрес на который этот указатель указывает. А для верности вообще можно так smile.gif:
Код
volatile char * volatile adr_sector;
AndreyVN
Можно еще вот такой галочкой решить проблему:
If Smart Register Allocation is not enabled, the registers will be allocated in the order of variable declaration.
The Smart Register Allocation option should be disabled if the program was developed using CodeVisionAVR
prior to V1.25.3 and it contains inline assembly code that accesses the variables located in registers R2 to R14 and R16 to R21.

Но, volotile более правильно.

Всем Спасибо! Проблема решена.
VladimirYU
Цитата(AndreyVN @ Feb 24 2009, 13:33) *
Можно еще вот такой галочкой решить проблему:
If Smart Register Allocation is not enabled, the registers will be allocated in the order of variable declaration.
The Smart Register Allocation option should be disabled if the program was developed using CodeVisionAVR
prior to V1.25.3 and it contains inline assembly code that accesses the variables located in registers R2 to R14 and R16 to R21.

Но, volotile более правильно.

Всем Спасибо! Проблема решена.

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