вызывая вектор прерывания внутри другого вектора прерывания - PullRequest
2 голосов
/ 21 декабря 2011

Можно ли вызвать вектор прерывания внутри другого вектора прерывания?

Например, когда я делаю процедуру в векторе прерывания ep4inout:

void ep4inout interrupt 0
{
   .
   .
   .
   Timer1 = 1; //call interrupt for timer 1
   .
   .
   .
}

Редактировать

Мой код выглядит примерно так. Timer1 = 1, означает, что запрос прерывания для таймера 1 установлен. Моя процедура в Таймере 1 ISR не работает. В руководстве для FX2LP таймер 1 имеет более высокий приоритет, чем буферы конечной точки. Я попытался установить приоритет Таймера 1 на высокий и Конечной точки 4 на низкий. Все тот же результат. Я использую Keil uVision2 в качестве моей IDE, а мой микроконтроллер - Cypress FX2LP (расширенный 8051 - USB-контроллер).

void ISR_Ep4inout(void) interrupt 0
{
   .
   .
   .
   Timer1Enable = 1;
   Timer1 = 1; //call interrupt for timer 1
   .
   .
   .
}

void TMR1_Vect(void) interrupt 2 //timer 1 interrupt
{
 .
 .
 .
}

void TMR1_Vect interrupt 0 //timer 1 interrupt
{
     .
     .
     .
}

1 Ответ

0 голосов
/ 21 декабря 2011

Если функции являются обычными функциями C, компилятор не может знать, что функция используется как прерывание.Да, вы можете вызвать эту функцию.

Если, как и в вашем случае, вы должны указать такие функции, используя interrupt 0 или любым другим способом (ISR, INTERRUPT), вы обычно не можете.
Проблема часто заключается в инструкции return (на уровне ассемблера), используемой для завершения функции: Для подпрограммы обработки прерывания компилятор должен использовать другую инструкцию возврата.

Вы указали другой методдля "вызова функции": я предполагаю, что Timer1 = 1; будет эффективно устанавливать бит запроса прерывания для прерывания по таймеру, что приведет к активации подпрограммы обработки прерывания.Это не должно быть проблемой вообще.Но вам нужно проверить руководства процессора / компилятора о том, какое прерывание обрабатывается первым, и если прерывания ISR прерываются.

Кстати, вы могли бы предоставить больше информации и подробностей.Не все говорят о «вызове вектора прерывания», а затем показывают, что «переменная» установлена ​​в единицу.Я предполагаю, что вы в разработке встроенных;пожалуйста, укажите такие вещи, как компилятор и / или процессор, поскольку они более чем уместны для предоставления полезного ответа.

...