Как правильно управлять "__attribute __ ((__ interrupt__, no_auto_psv))"? - PullRequest
0 голосов
/ 28 февраля 2020

Я программирую DSPIC33EP512GM710-I_PT TQFP с использованием MPLABX. Проблема заключается в том, что я генерирую 2 одинаковых прерывания, MPlabX записывает одно и то же имя функции в несколько файлов. c, поэтому компилятор генерирует ошибку, потому что 2 или более функций с одинаковыми имя создано

Вот 2 возможных решения:

Решение-1: Изменить имя прерывания, но тогда я не знаю, будет ли достигнуто прерывание

Решение-2 : Комментируйте все, кроме одной из функций прерывания, и в этом прерывании запрашивайте регистры, чтобы посмотреть, каково было настоящее прерывание

Примечание: я видел сообщение: Что означает __attribute __ ((__ interrupt__, no_auto_psv)) делать? А также руководство: (https://www.mouser.com/datasheet/2/268/MPLAB_XC16_v1_10_C_Compiler_UG_52081-477561.pdf стр. 128)

Но я не знаю, что делает микро, когда достигает прерывания, если оно выглядит последовательно во всех атрибут (( прерывание , no_auto_psv)) коды

Вот мой код, соответствующий решению-2:

void __attribute__ ( ( interrupt, no_auto_psv ) ) _CM1Interrupt(void)
{
    /*
     * *************  ALTERADO PARA ACEPTAR OTROS COMPARADORES ************************
    // CMP1 callback function 
    CMP1_CallBack();

    // Clear the CEVT bit to enable further interrupts
    CMP1_EventStatusReset();
          */

    if (CM1CONbits.CEVT)
    {
        //all up mosfets to 0
        aplica_mapa(0,6);      //todo a 0 
        delay_us1(5);
        CMP1_EventStatusReset();
    }

    if (CM2CONbits.CEVT)
    {
        //all up mosfets to 0
        aplica_mapa(1,6);     
        delay_us1(5);
        CMP2_EventStatusReset();
    }
    if (CM5CONbits.CEVT)
    {
        //all up mosfets to 0
        aplica_mapa(3,6);      //todo a 0 
        delay_us1(5);
        CMP5_EventStatusReset();
    }
    // clear the CMP1 interrupt flag
    IFS1bits.CMIF = 0;

}
...