2014-11-20 2 views
1

Я изучаю freeRTOS. Мне нужно написать обработчик прерывания ISR для программного обеспечения в freeRTOS для платформы PIC32 (cerebot Mx7ck). Я просмотрел документацию, но не помог. Пожалуйста, помогите кому-нибудь.Программное прерывание в freeRTOS

ответ

1
/* sW timer */ 
TimerHandle_t xSysMonTimer = NULL; 
xSysMonTimer = xTimerCreate("SysMonTimer",(500/portTICK_PERIOD_MS),pdFALSE,0,Sys_Mon_Callback); 
if(xSysMonTimer == NULL) 
{ 
    /* The timer was not created. */ 
} 
else 
{ 
    /* Start the timer. No block time is specified, and even if one was 
    it would be ignored because the RTOS scheduler has not yet been 
    started. */ 
    if(xTimerStart(xSysMonTimer, 0) != pdPASS) 
    { 
     /* The timer could not be set into the Active state. */ 
    } 
} 
void Sys_Mon_Callback(TimerHandle_t pxTimer) 
{ 
    if(xTimerReset(xSysMonTimer, 10) != pdPASS) 
    { 
     /* The reset command was not executed successfully. Take appropriate 
     action here. */ 
    } 
} 
1

Вы ищете программные прерывания таймера или что-то вроде SPI/I2C/UART? У меня есть несколько примеров. Я не знаю, будет ли то, что у меня есть, именно то, что захочет FreeRTOS, но он работает. Ниже представлен URI ISR в файлах uart.c и моих файлах isr.S.

void vU5InterruptHandler(void); 
void __attribute__((interrupt(ipl0), vector(_UART_5_VECTOR))) vU5InterruptWrapper(void); 
void vU5InterruptHandler(void) 
{ 
    /* Declared static to minimize stack use. */ 
    static char cChar; 
    static portBASE_TYPE xHigherPriorityTaskWoken; 
    xHigherPriorityTaskWoken = pdFALSE; 
    /* Are any Rx interrupts pending? */ 
    if(IFS2bits.U5RXIF == 1) 
    { 
     //while(U5STAbits.URXDA) 
     //{ 
      /* 
      ** Retrieve the received character and place it in the 
      ** queue of received characters. 
      */ 
      cChar = U5RXREG; 
      if(cChar != '\n') 
      { 
       xQueueSendFromISR(gps_event_queue, &cChar, &xHigherPriorityTaskWoken); 
      } 
     //} 
     IFS2CLR = _IFS2_U5RXIF_MASK; 
    } 

    /* Are any Tx interrupts pending? */ 
    if(IFS2bits.U5TXIF == 1) 
    { 
     IFS2CLR = _IFS2_U5TXIF_MASK; 
    } 

    /* If sending or receiving necessitates a context switch, then switch now. */ 
    portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); 
} 
/* isr.S */ 
.extern vU5InterruptHandler 
.global vU5InterruptWrapper 

.ent vU5InterruptWrapper 
vU5InterruptWrapper: 
    portSAVE_CONTEXT 
    jal vU5InterruptHandler 
    nop 
    portRESTORE_CONTEXT 
    .end vU5InterruptWrapper 
+0

спасибо за ваши усилия. Я ищу прерывание с программным обеспечением. Например, при использовании семафора api freertos происходит сбой программного обеспечения. Он не доступен как вектор прерывания, как в вашем примере. Для поддержки такого прерывания также требуется сборка. – Main

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