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

 
 
 
Reply to this topicStart new topic
> 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
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
aesok
сообщение Feb 23 2009, 19:40
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



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


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


Анатолий.
Go to the top of the page
 
+Quote Post
Nick_Shl
сообщение Feb 23 2009, 19:49
Сообщение #6


Участник
*

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



Цитата(aesok @ Feb 23 2009, 21:40) *
В данном случае должно быть:
Код
char * volatile adr_sector;
Ну в AVR'овском асме я не силен, так что с первого раза сложно понять что же хотят загрузить - адрес переменной указателя, или адрес на который этот указатель указывает. А для верности вообще можно так smile.gif:
Код
volatile char * volatile adr_sector;


Сообщение отредактировал Nick_Shl - Feb 23 2009, 19:49
Go to the top of the page
 
+Quote Post
AndreyVN
сообщение Feb 24 2009, 10:33
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 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
VladimirYU
сообщение Feb 24 2009, 11:04
Сообщение #8


Местный
***

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



Цитата(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.
Go to the top of the page
 
+Quote Post

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

 


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


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