Вопрос

Я знаю, что при работе с CCSV4 MSP430F2619 и Ti я могу получить более одного прерывания, чтобы использовать тот же обработчик прерываний с кодом, который выглядит что-то подобное:

#pragma vector=TIMERA1_VECTOR
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void){

ServiceWatchdogTimer();
}

Мой вопрос в том, когда я нахожусь в этом прерывании, есть ли способ выяснить, какой из этих прерываний получил меня здесь?

Это было полезно?

Решение

Общий ответ на ваш вопрос отсутствует Нет прямого метода для обнаружения, какое прерывание в настоящее время называется. Однако каждое прерывание имеет свой собственный флаг прерывания, чтобы вы могли проверить каждый флаг в прерывании. Вы должны и флаг с включенным, чтобы убедиться, что вы обрабатываете прерывание, которое фактически называлось. Также с таймами на MSP430 есть вектор Taiv, который может сказать вам, что обрабатывать в обработчике A1. Случай 0 Taiv - это то, что не было прерываний для обработчика A1, поэтому для этого случая вы можете предположить, что это обработчик A0.

Я бы сделал что-то вроде следующего.

#pragma vector=TIMERA0_VECTOR
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
   switch (TAIV)         // Efficient switch-implementation
   {
     case  TAIV_NONE:          // TACCR0             TIMERA0_VECTOR
        break;
     case  TAIV_TACCR1:        // TACCR1             TIMERA1_VECTOR
        break;
     case  TAIV_TACCR2:        // TACCR2             TIMERA1_VECTOR
        break;
     case TBIV_TBIFG:          // Timer_A3 overflow  TIMERA1_VECTOR
        break;
     default;
        break;
   }
   ServiceWatchdogTimer();
}

Другие советы

Не на самом деле «хороший» ответ, но почему бы не сделать 2 отдельные обработчики прерываний призывают ту же функцию?

что-то вроде

__interrupt void Timer_A0_handler (void){
  Timer_Handler(0);
}
__interrupt void Timer_A1_handler (void){
  Timer_Handler(1);
}
void Timer_Handler(int which){
  if(which==1){
    ...
  }else{
    ...
  }
  ...
  ServiceWatchdogTimer();
}

Глядя на то MSP430x1xx Руководство пользователя семьи, Похоже, что устройство не поддерживает реестр состояния прерывания с этой информацией напрямую. Вам либо нужно будет иметь 2 отдельных прерывания векторов, чтобы вы могли определить разницу напрямую, или вам нужно будет запрашивать оба устройства, чтобы увидеть, что требует обслуживания.

Если вы используете 2 вектора прерываний, они могут, безусловно, вызовут или прыгают (если вы используете сборку) к той же процедуре для выполнения массы работы, как в Ответ, данный Arrz.

Обратите внимание, что у чипов уже есть таблица вектора прерывания, поэтому делать то, о чем вы говорите в комментарии, который вы сделали в другом ответе, вам просто нужно указать векторные записи прерывания для «неиспользованных» прерываний к процедуру, которая бросает ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top