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

 
 
> unexpected REGDEF, Никто не встречал?
AndreyVN
сообщение Feb 21 2009, 09:08
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



Всем привет!

Вот такая ошибка (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


Самое интересное, что я такой конструкцией уже пользовался, вроде, все было нормально. Что могла случиться?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladimirYU
сообщение Feb 21 2009, 10:32
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(AndreyVN @ Feb 21 2009, 12:08) *
Всем привет!

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


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


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

А если просто

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

Не пробовали? CVAVR вещь в себе.
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Feb 23 2009, 05:57
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



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

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

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

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

А иногда, никаких DEF'ов не делает, тогда все компилируется нормально. Как с этим бороться, пока не знаю.
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение Feb 23 2009, 19:10
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850



Цитата(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;
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Feb 24 2009, 10:33
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458



Можно еще вот такой галочкой решить проблему:
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 более правильно.

Всем Спасибо! Проблема решена.
Go to the top of the page
 
+Quote Post



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

 


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


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