2010-04-13 2 views
4

Я знаю, что при работе с MSP430F2619 и CCS 4 TI, я могу получить больше, чем одно прерывание, чтобы использовать один и тот же обработчик прерываний с кодом, который выглядит примерно так:TI MSP430 прерывания источник

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

ServiceWatchdogTimer(); 
} 

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

+0

Чтобы сделать это сообщение ясным, я ищу смещение в таблице, в основном значение «вектор» в приведенном выше коде. – TheDelChop

+0

Почему вы хотите иметь одно и то же прерывание для обоих? Вы должны использовать знания различных перерывов, которые могут вас найти, чтобы узнать. – eaanon01

ответ

5

Общий ответ на ваш вопрос: нет никакого прямого способа определить, какое прерывание в настоящее время вызывается. Однако каждое прерывание имеет свой собственный флаг прерывания, поэтому вы можете проверить каждый флаг в прерывании. Вы должны и флаг с включенным, чтобы убедиться, что вы обрабатываете прерывание, которое на самом деле было вызвано. Также с таймерами на 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(); 
} 
+0

Вы должны поменять свои номера в коммутаторе TAIV_NONE, TAIV_TACCR1, TAIV_TACCR2, TBIV_TBIFG. – eaanon01

+0

На MSP430F2122 (и, возможно, на других) эти константы являются 'TA0IV_NONE',' TA0IV_TACCR1', 'TA0IV_TACCR2' и' TA0IV_TAIFG'. –

2

Не совсем «хороший» ответ, но почему бы не сделать 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(); 
} 
+0

Обратите также внимание на то, что может быть определен какой-то конкретный способ определения того, что прерывает в настоящее время. Я не знаю эту платформу. – Earlz

+0

Я не люблю эту идею, потому что то, что я действительно хочу сделать, это настроить таблицу поиска конкретных обработчиков, поэтому, когда вызывается прерывание, она смотрит на номер вектора, просматривает обработчик прерываний для этого вектора. Если его NULL, выведите ошибку, и если ее не NULL, выполните обработчик. Ваше решение будет очень грязным. – TheDelChop

+0

да, это было бы. К сожалению, я не вижу способа обойти это. Создание ОС для ПК (x86) Я хотел сделать что-то подобное, и мне пришлось написать самомодифицирующийся/дублирующий код, чтобы заполнить таблицу поиска во время выполнения. Это тоже было не очень красиво, но гораздо более красивое, чем более 32 дублирующих функций для каждого прерывания, которое я обрабатываю. – Earlz

2

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

Если вы используете 2 вектора прерываний, они могут, конечно, позвонить или перейти (если вы используете сборку) к той же самой процедуре, чтобы выполнить основную часть работы, как в answer given by Earlz.

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