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.