[an error occurred while processing this directive]
Объясняю (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено Беня 28 февраля 2006 г. 15:22
В ответ на: куда они могут пропасть? о чём вы говорите тем паче что анализ в маин. а есл по-вашему то это неправильная прога отправлено m16 28 февраля 2006 г. 14:36

Допустим у вас в фоне в main() есть строка :
PORTC |= 0xE0;
(в качестве переменной используем PORTC в примере).
Эта строка компилятором преобразуется в 3 команды :
IN R16,0x15
ORI R16,0xE0
OUT 0x15,R16

Допустим, у вас в PORTC записан 0.
IN R16, 0x15 ; в R16 у Вас 0
ORI R16,0xE0 ; в R16 у Вас 0xE0
OUT 0x15,R16 ; в PORTC записываем 0xE0

А теперь предположим, что у Вас есть прерывание, которое устанавливает младший бит PORTC в 1. Пускай это прерывание возникает после первой строки (после IN R16, 0x15 ).

IN R16, 0x15 ; в R16 у Вас 0
; здесь вызывается прерывание, которое записывает 1 в PORTC
; т. е. сейчас в PORTC реально 0x01 находится и если мы сейчас
; сделаем IN R16, 0x15, то в R16 будет 1
; возвращаемся из прерывания и продолжаем
ORI R16,0xE0 ; в R16 у Вас 0xE0, а в PORTC 1
OUT 0x15,R16 ; в PORTC записываем 0xE0

И так, результат установления 1 на PORTC в прерывании пропал, потому что мы записываем в PORTC значение из R16.
Теперь понятно ?



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

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

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

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


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

E-mail: info@telesys.ru