Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пара вопросов (ATmega8.C, WinAVR)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AlexKLm
Есть в ATmega8.pdf табличка под названием
Register Summary
и в ней строчка:
0x3F (0x5F) SREG I T H S V N Z C 7

Что значит 0x3F (0x5F)?
SREG имеет вроде как один адрес в I/O пространстве, или еше какой-нибудь?

Другой вопрос. Убиение сторожевой собаки, сделанное inline макросом
из заголовочного файла, в дизасебле выглядит так:
67a: 81 bd out 0x21, r24 ; 33
67c: 11 bc out 0x21, r1 ; 33
67e: 0f be out 0x3f, r0 ; 63

А то же самое, но сделаное следующим кодом (в main())

WDTCR |= (1<<WDCE) | (1<<WDE);//и тут же меняем WDE на 1 и в следующие 4 клока меняем WDE
WDTCR &= ~(1<<WDE);// -т.е. WDE устанавливаем в 0 , запрещаем дог

производит такой код:
716: a1 e4 ldi r26, 0x41 ; 65
718: b0 e0 ldi r27, 0x00 ; 0
71a: e1 e4 ldi r30, 0x41 ; 65
71c: f0 e0 ldi r31, 0x00 ; 0
71e: 80 81 ld r24, Z
720: 88 61 ori r24, 0x18 ; 24
722: 8c 93 st X, r24
724: a1 e4 ldi r26, 0x41 ; 65
726: b0 e0 ldi r27, 0x00 ; 0
728: e1 e4 ldi r30, 0x41 ; 65
72a: f0 e0 ldi r31, 0x00 ; 0
72c: 80 81 ld r24, Z
72e: 87 7f andi r24, 0xF7 ; 247
730: 8c 93 st X, r24

Как видно, длина кода слегка не одинаковая. Но непонятно другое, почему тут используется
0x41 вместо 0x21? Из таблицы известно что 0x21 (0x41) это WDTCR. Так всеже 0x21 или 0x41?
vet
1)
0x3F - адрес регистра в адресном пространстве портов (IN, OUT)
0x5F - то же самое, в адресном пространстве ОЗУ (LDS, STS)

Любой регистр, адресуемый через а.п. портов, доступен также и в а.п. ОЗУ; адреса отличаются на 0x20. Результат одинаков, без учета длины и времени выполнения команд.

2)
Оптимизация кода включена? если да - результат на совести разработчиков avr-gcc. IAR или CodeVisionAVR в данном случае сгенерируют оптимальный код.
AlexKLm
vet, спасибо за ответ, жалко что я не смог это сразу понять.
Оптимизация была выключена. Только что попробовал включить, - сработало, выдало:
410: 81 b1 in r24, 0x21 ; 1
412: 88 61 ori r24, 0x18 ; 24
414: 81 b9 out 0x21, r24 ; 1
416: 0b 98 cbi 0x21, 3 ; 1

Но, у меня не шло все это в не оптипизированном виде, я не мог придушить watchdog, как ни бился, не работают ld st почему-то. Попробую теперь, с оптимизацией. Размер кода-то существенно уменьшается. Я включал опцию -O 3, он тогда только выбросил ld и st где смог. Кажется разобрался, а то неделю не мог Watchdog заглушить. И получается - только из-за того что оптимизацию не включил. Если я ошибаюсь, то еще напишу результат.

Так все же правильно, русским же языком написано:
"Within the next four clock cycles, write a logic 0 to WDE."
А какие же там "four clock cycles" если между записями в WDTCR аж 6 инструкций.
mdmitry
Цитата(AlexKLm @ Mar 26 2008, 00:09) *
Я включал опцию -O 3, он тогда только выбросил ld и st где смог.

Почитайте описание библиотеки avr-lib и компилятора. -O3 не всегда лучний вариант оптимизации, сам использую -O2
КСПшник
Цитата(mdmitry @ Mar 26 2008, 00:37) *
Почитайте описание библиотеки avr-lib и компилятора. -O3 не всегда лучний вариант оптимизации, сам использую -O2


Всегда (или почти всегда) пользую уровень Os (проблем не замечено)... Если необходимо отдельный модуль компильнуть с другим уровнем или вообще без оптимизации - решается в makefile.
mdmitry
Цитата(КСПшник @ Mar 26 2008, 12:12) *
Всегда (или почти всегда) пользую уровень Os (проблем не замечено)..

Это оптимизация по объему кода, а -O2 -O3 по скорости выполнения
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.