[an error occurred while processing this directive]
|
unsigned char t = 0;SIGNAL(SIG_INTERRUPT0)
{
PORTB = t;
}
int main()
{
DDRB = 0xFF;while (1)
{
t++;
}
}
Как можно догадаться, программа якобы выводит по внешнему прерыванию значение счетчика t в порт B.
Обработчик прерывания. Берет значение переменной t из памяти и выводит в порт. Все правильно.
8:tm.c **** SIGNAL(SIG_INTERRUPT0)
9:tm.c **** {
82 .LM1:
83 /* prologue: frame size=0 */
84 0000 1F92 push __zero_reg__
85 0002 0F92 push __tmp_reg__
86 0004 0FB6 in __tmp_reg__,__SREG__
87 0006 0F92 push __tmp_reg__
88 0008 1124 clr __zero_reg__
89 000a 8F93 push r24
90 /* prologue end (size=6) */
10:tm.c **** INTERRUPT0)
92 .LM2:
93 000c 8091 0000 lds r24,t
94 0010 85B9 out 37-0x20,r24
95 /* epilogue: frame size=0 */
96 0012 8F91 pop r24
97 0014 0F90 pop __tmp_reg__
98 0016 0FBE out __SREG__,__tmp_reg__
99 0018 0F90 pop __tmp_reg__
100 001a 1F90 pop __zero_reg__
101 001c 1895 reti
102 /* epilogue end (size=6) */
103 /* function __vector_1 size 15 (3) */
Функция main
Пролог (опущено)
Вывод 0xFF в DDRB (все честно)
120 0026 8FEF ldi r24,lo8(-1)
121 0028 84B9 out 36-0x20,r24
И вечный цикл. Так как мы не указали, что переменная t volatile, и в цикле нет вызовов функций, компилятор считает, что переменная t никому не нужна ничего с ней не делает. Имеет право.
122 .L3:
17:tm.c **** PORTB = t;
18:tm.c **** }
19:tm.c ****
20:tm.c ****
124 .LM5:
125 002a FFCF rjmp .L3
Составить ответ ||| Конференция ||| Архив
Ответы
E-mail: info@telesys.ru