AndreyVN 0 21 февраля, 2009 Опубликовано 21 февраля, 2009 · Жалоба Всем привет! Вот такая ошибка (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 0 21 февраля, 2009 Опубликовано 21 февраля, 2009 · Жалоба Всем привет! Вот такая ошибка (CVAVR 2.03.4): Вот фрагмент кода: Самое интересное, что я такой конструкцией уже пользовался, вроде, все было нормально. Что могла случиться? А если просто ldi R26,LOW(Sector) ; ldi R27,HIGH(Sector); Не пробовали? CVAVR вещь в себе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 23 февраля, 2009 Опубликовано 23 февраля, 2009 · Жалоба А если просто .... Не пробовали? CVAVR вещь в себе. То же самое получается. Приблизительно понял, что происходит. Иногда компилятор присваивает имя переменной на которую я ссылаюсь в ассемблерном коде: ;NAME DEFINITIONS FOR GLOBAL VARIABLES ALLOCATED TO REGISTERS .DEF _adr_sector=R3 В этом случае возникает ошибка. А иногда, никаких DEF'ов не делает, тогда все компилируется нормально. Как с этим бороться, пока не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_Shl 0 23 февраля, 2009 Опубликовано 23 февраля, 2009 · Жалоба А иногда, никаких 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 0 23 февраля, 2009 Опубликовано 23 февраля, 2009 · Жалоба Вывод: объявлением переменной нужно добавить volatile. Вот так: volatile char *adr_sector; В данном случае должно быть: char * volatile adr_sector; Анатолий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_Shl 0 23 февраля, 2009 Опубликовано 23 февраля, 2009 (изменено) · Жалоба В данном случае должно быть: char * volatile adr_sector; Ну в AVR'овском асме я не силен, так что с первого раза сложно понять что же хотят загрузить - адрес переменной указателя, или адрес на который этот указатель указывает. А для верности вообще можно так :): volatile char * volatile adr_sector; Изменено 23 февраля, 2009 пользователем Nick_Shl Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndreyVN 0 24 февраля, 2009 Опубликовано 24 февраля, 2009 · Жалоба Можно еще вот такой галочкой решить проблему: 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 0 24 февраля, 2009 Опубликовано 24 февраля, 2009 · Жалоба Можно еще вот такой галочкой решить проблему: 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться