реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
Mishel
сообщение Mar 8 2006, 06:23
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 10-02-06
Пользователь №: 14 205



Сколько я ни читаю даташит, но до конца так и не понял: что происходит, если во время отработки прерывания (до сброса флага прерывания, например TMR0IF - на F877) возникают условия для нового прерывания (другой природы, например CMIF).
В "Справочнике по среднему семейству..." с микрочип.ру, на странице 106 (по нумерации acrobat) есть упоминания об "отложенных" и "ожидающих" прерываниях:
"Возврат из обработки прерываний выполняется по команде RETFIE, пои этом происходит установка бита GIE в '1', что позволяет обработать любое ОТЛОЖЕННОЕ ПРЕРЫВАНИЕ".
"Примечание 2. При выполнении команды, сбрасывающей бит GIE в '0', любое прерывание, ОЖИДАЮЩЕЕ выполнения в следующем машинном цикле, игнорируется. ... Игнорированные прерывания ставятся в ОЖИДАНИЕ выполнения, пока бит GIE не будет установлен в '1'".
Однако на этом описание данного вопроса и заканчивается. В официальных даташитах на английском - ещё меньше.
Я уже понял, что процедура прерывания не может быть прервана другим прерыванием. Но существует ли очередь отложенных прерываний - хз.
В принципе незнание данной тонкости не мешает мне писать на "бытовом" уровне, и оно работает, но хотелось бы...
Go to the top of the page
 
+Quote Post
miga
сообщение Mar 8 2006, 19:25
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 6-04-05
Пользователь №: 3 928



Цитата(Mishel @ Mar 8 2006, 09:23) *
существует ли очередь отложенных прерываний

Очереди как таковой не существует - есть лишь механизм флажков прерываний, другими словами, если флажок како-либо прерывания оказался взведен, невозможно определить сколько раз возникало условие прерывания, соответствующее этому флажку.
Go to the top of the page
 
+Quote Post
*Leks*
сообщение Mar 9 2006, 09:44
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 28-01-06
Из: Москва
Пользователь №: 13 719



В начале обработки прерывания надо запретить прерывания и сбросить флаг, вызвавший прерывание. Разрешить новое прерывание нужно только при выходе из обработки. Теперь при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно.
Go to the top of the page
 
+Quote Post
miga
сообщение Mar 10 2006, 18:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 117
Регистрация: 6-04-05
Пользователь №: 3 928



Цитата(*Leks* @ Mar 9 2006, 12:44) *
В начале обработки прерывания надо запретить прерывания ...
Разрешить новое прерывание нужно только при выходе из обработки.

Собственно говоря, все это делается автоматически - никаких дополнительных манипуляций с GIE делать не нужно.
Go to the top of the page
 
+Quote Post
Mishel
сообщение Mar 11 2006, 15:49
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 10-02-06
Пользователь №: 14 205



miga писал:
Очереди как таковой не существует - есть лишь механизм флажков прерываний

*Leks* писал:
при возникновении нового условия прерывания программа сначала закончит обработку старого а затем, при выходе из обработки, снова зайдёт обратно

Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным.
При этом
1) Будет поднят флаг прерывания, и возможно, обработан и сброшен в том же проходе процедуры;
2) Если по выходе из процедуры прерывания обнаруживается поднятый флаг, процедура автоматически будет запущена снова.
Я правильно понимаю?
Go to the top of the page
 
+Quote Post
LordN
сообщение Mar 11 2006, 16:00
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 704
Регистрация: 15-10-05
Из: г.Томск
Пользователь №: 9 686



Цитата
Я правильно понимаю?
да.
Цитата
Ага. То есть событие, возникшее в момент работы процедуры прерывания, не останется незамеченным.
не останется, его заметят и обработают обязательно если включены соответсвующие флаги.

Сообщение отредактировал LordN - Mar 11 2006, 16:00


--------------------
C уважением, LordN.
Go to the top of the page
 
+Quote Post
alekseykoj
сообщение Mar 17 2006, 08:36
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 60
Регистрация: 8-11-05
Пользователь №: 10 602



Флажки прерывания тут не при чем они только для информации произошло прерывание или нет. Для тебя. Программу необходимо строить так чтоб в процедуре прерывания находится как можно меньше
Go to the top of the page
 
+Quote Post
Alich
сообщение Mar 29 2006, 13:49
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 27-01-06
Из: г. Ярославль
Пользователь №: 13 686



Тут просто надо понимать команду RETFIE - как возврат из подпрограммы с разрешением прерываний. И все встанет на свои места
Go to the top of the page
 
+Quote Post
bzx
сообщение Mar 29 2006, 14:36
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Пример построения обработчика прерывания.
Код
    org    0x04
; Сохранение контекста системных регистров STATUS, W, FSR и пр.
; если регистры не используются при обработки системных прерываний,
; то их можно и не сохранять
    movwf    w_temp
    movfw    STATUS
    movwf    status_temp
    movfw    FSR
    movwf    FSR_temp
....

; Анализ того, кем вызвано прерывание
    btfsc    INTCON,T0IF
    goto    InterruptT0; Прерывание T0

    btfsc    INTCON,RAIF
    goto    Change_Interrupt; Прерывание по изменению состояния

    btfsc    PIR1,C1IF
    goto    InterruptComparator; Прерывание компаратора
......
; и т.д.
InterruptT0:
...
InterruptComparator:
...
; Выход из обработчика прерываний
; Востановление контекста системных регистров
Interrupt_exit:
    clrwdt
    movfw    FSR_temp
    movwf    FSR
    movfw    status_temp
    movwf    STATUS
    swapf    w_temp,f
    swapf    w_temp,w
    retfie


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
Mishel
сообщение Apr 1 2006, 04:49
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 10-02-06
Пользователь №: 14 205



bzx писал:
Пример построения обработчика прерывания...

Благодарю, но я таки предпочитаю писать на сях, ибо время-деньги.

Спасибо всем за потраченное время. Кажется, у меня появилась некая ясность в данном вопросе. Дальше разберёмся.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 19:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016