2011-12-21 3 views
2

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

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

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

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

Мой код выглядит примерно так. Timer1 = 1, означает, что задан запрос прерывания для таймера 1. Моя процедура в таймер 1 ISR не работает. В руководстве для FX2LP таймер 1 имеет более высокий приоритет, чем буферы Endpoint. Я попытался установить приоритет таймера 1 на высокий, а конечная точка 4 - на низкий. Все тот же результат. Im, использующий 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 
{ 
    . 
    . 
    . 
} 

ответ

0

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

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

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

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

+0

Большое спасибо за ответ. Я использую Keil uVision 2 и мой микроконтроллер Cypress FX2LP. После тестирования ISR для таймера 1 не прерывается, моя процедура вообще не работает. Таймер 1 означает, что было вызвано прерывание для таймера 1. Кстати, каков приоритет конечной точки 4? –

+2

@FranzMationg Было бы лучше, если вы отредактируете исходный вопрос и добавите эту информацию там. Сайт предназначен для вас не только для вас, но и для всех, у кого одинаковый или похожий вопрос. Кроме того, для тех, кто не очень хорошо знаком с семейством контроллеров Cypress USB, было бы полезно указать, что процессор является усовершенствованной версией 8051. –

Смежные вопросы