Перейти к содержанию
    

unexpected REGDEF

Всем привет!

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет!

 

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

 

 

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

 

 

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

А если просто

 

ldi R26,LOW(Sector) ;

ldi R27,HIGH(Sector);

 

Не пробовали? CVAVR вещь в себе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если просто

....

Не пробовали? CVAVR вещь в себе.

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

 

Приблизительно понял, что происходит. Иногда компилятор присваивает имя переменной на которую я ссылаюсь в ассемблерном коде:

;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS

.DEF _adr_sector=R3

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

 

А иногда, никаких DEF'ов не делает, тогда все компилируется нормально. Как с этим бороться, пока не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А иногда, никаких 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вывод: объявлением переменной нужно добавить volatile. Вот так:

volatile char *adr_sector;

 

В данном случае должно быть:

char * volatile adr_sector;

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В данном случае должно быть:

char * volatile adr_sector;

Ну в AVR'овском асме я не силен, так что с первого раза сложно понять что же хотят загрузить - адрес переменной указателя, или адрес на который этот указатель указывает. А для верности вообще можно так :):

volatile char * volatile adr_sector;

Изменено пользователем Nick_Shl

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно еще вот такой галочкой решить проблему:

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 более правильно.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно еще вот такой галочкой решить проблему:

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...