|
|
  |
Пара вопросов (ATmega8.C, WinAVR) |
|
|
|
Mar 25 2008, 19:32
|

Частый гость
 
Группа: Свой
Сообщений: 160
Регистрация: 17-03-08
Из: Мурманская
Пользователь №: 35 989

|
Есть в 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?
--------------------
Демократия - это когда считается, что два дурака лучше одного умного Суверенная демократия - это когда считается, что один дурак лучше двух дураков
|
|
|
|
|
Mar 25 2008, 21:09
|

Частый гость
 
Группа: Свой
Сообщений: 160
Регистрация: 17-03-08
Из: Мурманская
Пользователь №: 35 989

|
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 инструкций.
--------------------
Демократия - это когда считается, что два дурака лучше одного умного Суверенная демократия - это когда считается, что один дурак лучше двух дураков
|
|
|
|
|
Mar 26 2008, 09:12
|
Участник

Группа: Свой
Сообщений: 57
Регистрация: 7-09-05
Пользователь №: 8 307

|
Цитата(mdmitry @ Mar 26 2008, 00:37)  Почитайте описание библиотеки avr-lib и компилятора. -O3 не всегда лучний вариант оптимизации, сам использую -O2 Всегда (или почти всегда) пользую уровень Os (проблем не замечено)... Если необходимо отдельный модуль компильнуть с другим уровнем или вообще без оптимизации - решается в makefile.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|