[an error occurred while processing this directive]
а вот пример, почему нужно ставить volatile на используемые в прерывании переменные (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено радиолюбитель без лицензии 13 декабря 2005 г. 16:57
В ответ на: есть необходимость, и изменяемые, и как правило используемые (+) отправлено <font color=gray>радиолюбитель без лицензии</font> 13 декабря 2005 г. 16:39


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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru