Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: создание регистровых переменных в WINAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
stapleman
Здравствуйте.
Проблема заключается в следующем:
в winavr создал регистровую глобальную переменую
register uint8_t qqq asm ("r5");
внутри прерывания сначала шлю значение по усарту
USART0TxByte(qqq);
потом пытаюсь вычесть из нее единицу
asm volatile ( "dec r5 \n\t":smile.gif;
и шлю еще раз
USART0TxByte(qqq);
А на компе вижу, что значение не меняется.
Скажите пожалуйста, что не так.
P.S. Оптимизация равняется 3.
aesok
Вы не указали компилятору что r5 изменяется в ассемблерной вставке.

Цитата
Clobbers
As stated previously, the last part of the asm statement, the list of clobbers, may be omitted, including the colon seperator. However, if you are using registers, which had not been passed as operands, you need to inform the compiler about this...


Анатолий.
stapleman
Цитата(aesok @ Aug 10 2009, 17:24) *
Вы не указали компилятору что r5 изменяется в ассемблерной вставке.

Здравствуйте.
Мне кажется, что дело не в этом. Так в листинге строка:" dec r5 ", присутствует.
ARV
а почему вообще не сделать qqq--; ???
Qwertty
Цитата(stapleman @ Aug 11 2009, 11:17) *
Так в листинге строка:" dec r5 ", присутствует.

Еще бы ее не было после asm volatile smile.gif
Анатолий все верно говорит - компилятор пользуется не самой переменной, а ее копией. И надо ему сообщить, что копия устарела. Только не пытайтесь объявлять регистровую переменную с квалификатором volatile - GCC почему то с таким вариантом не работает нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.