Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-дек-17 13:21

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Прерывания в 1886ВЕ2
СообщениеДобавлено: 2011-май-26 08:22 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Здравствуйте. Есть некоторые неясности с программной обработкой прерываний.

В примерах используется связка IDE for 1886(полная версия)+СС7А.
В микроконтроллере 1886ВЕ2 есть 4 вектора прерываний. Вопрос 1: правильно ли я понимаю, что прерывания высшего приоритета «прерывают» обработку прерываний более низших приоритетов? Или приоритет играет роль лишь при одновременном возникновении соответствующих условий?
Вопрос 2: если случай первый, то необходимо каждый раз сохранять и восстанавливать нужные регистры при входе и выходе в/из прерываний. Получается, использование каждый раз макросов multi_interrupt_entry_and_save и interrupt_exit_and_restore неприемлемо.

Также возникли проблемы с определением процедуры обработки прерываний. Например такой код
Код:
interrupt iService(void)
{
INT_service:   
    multi_interrupt_entry_and_save



    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
// process Timer 0 interrupt
    // T0IF is automatically cleared when the CPU vectors to 0x10
    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
   
    //
    //T0IF = 0;  //Сброс флага прерывания.

    //какой-либо код.

    interrupt_exit_and_restore   
//    retfie;
TMR0_service:
T0CKI_service:
PERIPHERAL_service:   

при размещении его после директивы #pragma origin 0x0008 обрабатывается компилятором по всей видимости неверно, т. к. происходит перекрытие кодом других векторов прерываний с выдачей соответствующей ошибки компилятора. А отключить мультивекторность прерываний и использовать только вектор 0x0008 не представляется возможным (если я не прав — пожалуйста, поправьте).

Пробую использовать следующий код, в котором с каждого вектора прерываний осуществляется переход на другие адреса в памяти программ, по которым и располагаются процедуры обработки прерываний:
Код:
#pragma origin 0x0008   //Вектор прерывания по сигналу PA0/INT.
interrupt ISR_0008(void)
{
   #asm
      DW __GOTO(0x400);
   #endasm           
}

/******************************************************************************/   
#pragma origin 0x0010   //Вектор прерывания по переполнению TMR0 (T0IF).
interrupt ISR_0010(void)
{
   #asm
      DW __GOTO(0x500);
   #endasm        
}
/******************************************************************************/   
#pragma origin 0x0018   //Вектор прерывания по сигналу PA1/T0CLK.
interrupt ISR_0018(void)
{
   #asm
      DW __GOTO(0x600);
   #endasm        
}
/******************************************************************************/   
#pragma origin 0x0020   //Вектор прерываний с периферийных модулей.
interrupt ISR_0020(void)
{
   #asm
      DW __GOTO(0x700);
   #endasm        
}

Вопрос 3: быть может стоит с разных векторов прерываний переходить на один и тот же адрес в памяти программ, по которому будет размещаться одна процедура обработки прерываний с проверкой соответствующих флагов?
Вопрос 4: есть предположение что я не до конца разобрался с определением и размещение кода процедуры обработки прерываний — со стандартно предлагаемым interrupt iService(void). Может есть лучшие варианты?
________________
Спасибо


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Прерывания в 1886ВЕ2
СообщениеДобавлено: 2011-май-26 10:22 
Не в сети

Зарегистрирован: 2010-июл-08 08:50
Сообщения: 734
Откуда: АО "ПКК Миландр"
Igor писал(а):
Вопрос 1: правильно ли я понимаю, что прерывания высшего приоритета «прерывают» обработку прерываний более низших приоритетов? Или приоритет играет роль лишь при одновременном возникновении соответствующих условий?


Приоритет играет роль только при одновременном возникновении соответствующих условий прерываний


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-май-26 11:30 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
1. Неправильно. Прерывание сбрасывает глобальный флаг разрешения прерываний, а команда retfie восстанавливает. Тяжело представить себе, для чего потребуются вложенные прерывания.
2. Рекомендуемый макрос берет на себя всю рутинную работу по распределению векторов, смотрите на итоговый ассемблерный код.
3, 4. Советую использовать эти программы, написанные совсем не глупыми людьми, и не изобретать очередной велосипед.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Прерывания в 1886ВЕ2
СообщениеДобавлено: 2011-май-26 12:25 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Спасибо за оперативный ответ.

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-май-26 12:33 
Не в сети

Зарегистрирован: 2011-май-26 07:22
Сообщения: 16
Lew писал(а):
Тяжело представить себе, для чего потребуются вложенные прерывания.


В семействе PIC18 два разноприоритетных вектора прерываний. Там прерывания высокого приоритета могут "прерывать" процедуры обработки прерываний низкого приоритета. Использование вложенных прерываний является достаточно распространенной задачей. Особенно в системах реального времени. Примером могут служить задачи, в которых требуется выполнять выборки аналоговых сигналов с жесткой дискретизацей.
Это я не к критике, это я пытаюсь объяснить ход моих рассуждений при возникновении выше заданных вопросов. Спасибо.
________________
P.S. объявление процедуры обработки прерываний выглядит так: interrupt iServer(void). Я же неправильно написал её название. Не хотелось бы других вводить в заблуждение этим. Вопрос решился.

_________________
#include <brain.h>


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-май-27 09:51 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
Igor писал(а):
Lew писал(а):
Тяжело представить себе, для чего потребуются вложенные прерывания.


В семействе PIC18 два разноприоритетных вектора прерываний. Там прерывания высокого приоритета могут "прерывать" процедуры обработки прерываний низкого приоритета. Использование вложенных прерываний является достаточно распространенной задачей. Особенно в системах реального времени. Примером могут служить задачи, в которых требуется выполнять выборки аналоговых сигналов с жесткой дискретизацей.
Это я не к критике, это я пытаюсь объяснить ход моих рассуждений при возникновении выше заданных вопросов. Спасибо.
________________
P.S. объявление процедуры обработки прерываний выглядит так: interrupt iServer(void). Я же неправильно написал её название. Не хотелось бы других вводить в заблуждение этим. Вопрос решился.


Вложенные прерывания вещь очень полезная. В ВЕ2 их можно сделать, но только программно реализованным диспетчером прерываний.

Делается это примерно так. При переходе по вектору прерывания, в микроконтроллере устанавливается флаг GLINTD (глобального запрета прерывания). Ваша подпрограмма-диспетчер должна сохранить все используемые программой обработки прерывания регистры в специально отведенной области, организованной, например, по принципу стека, а затем, если еще есть место для сохранения регистров, разрешить прерывания сбросом флага GLINTD. После окончания выполнения программы обработки текущего прерывания, производится запрет прерываний установкой GLINTD, востановление значений регистров из импровизированного стека и выполнение команды RETFIE (которая сбрасывает GLINTD).

Количество вложений прерываний при этом ограничено только объемом памяти, выделенным для сохранения значений регистров, а система приоритетов прерываний ограничена только Вашей фантазией.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 2011-май-27 16:40 
Не в сети

Зарегистрирован: 2009-май-25 15:07
Сообщения: 158
Откуда: АО "ПКК Миландр"
oleg писал(а):
Количество вложений прерываний при этом ограничено только объемом памяти, выделенным для сохранения значений регистров, а система приоритетов прерываний ограничена только Вашей фантазией.

Количество вложений прерываний тут ограничено скорее размером аппаратного стека, который также используется при вложенных вызовах подпрограмм.
Да и все равно при таком подходе системы реального времени с фиксированным откликом на события не получится, потому что всегда будут моменты времени, когда прерывания запрещены. Для большинства применений достаточно минимизировать длительность процедур прерываний или оставить только одно критическое по времени прерывание.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB