[STM32][FreeRTOS]Priorytety przerwań, Systick i przerwania od peryferiów

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
mciej
Posty: 1
Rejestracja: piątek 20 lip 2018, 11:09

[STM32][FreeRTOS]Priorytety przerwań, Systick i przerwania od peryferiów

Postautor: mciej » piątek 20 lip 2018, 11:13

Cześć,

mam skonfigurowanego i działającego FreeRTOSa na STM32L452, priorytety w FreeRTOSConfig.h są skonfigurowane następująco:

Kod: Zaznacz cały

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY         15
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY    5
#define configKERNEL_INTERRUPT_PRIORITY                 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            191 /* equivalent to 0xb0, or priority 11. */
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY         15

Priority grouping jest ustawione na grupę 4 zgodnie z dokumentacją FreeRTOSa:

Kod: Zaznacz cały

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);

zgodnie z powyższym, Systick ma najwyższy możliwy priorytet, uruchamiając przerwanie np. od SPI z pre-emption priority = 15:

Kod: Zaznacz cały

HAL_NVIC_SetPriority(SPI1_IRQn, 15, 0);
NVIC_EnableIRQ(SPI1_IRQn);

wszystko jest ok, jednak ustawiając pre-emption priority poniżej 15, w momencie wystąpienia przerwania od SPI, przerwanie od Systick'a nie występuje.
Występowanie przerwania Systick lub jego brak obserwuje na wykresie z oscyloskopu sterując pinem w przerwaniu.

Kod: Zaznacz cały

void xPortSysTickHandler( void )
{
   /* The SysTick runs at the lowest interrupt priority, so when this interrupt
   executes all interrupts must be unmasked.  There is therefore no need to
   save and then restore the interrupt mask value as its value is already
   known. */
   GPIOC->ODR ^= GPIO_PIN_3;

   portDISABLE_INTERRUPTS();
   {
      /* Increment the RTOS tick. */
      if( xTaskIncrementTick() != pdFALSE )
      {
         /* A context switch is required.  Context switching is performed in
         the PendSV interrupt.  Pend the PendSV interrupt. */
         portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
      }
   }
   portENABLE_INTERRUPTS();
}

Czy coś mam źle skonfigurowane? Z góry dzięki za pomoc.

Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość