Коллеги, добрый день.
Подскажите что-нибудь !
После выхода из обработчика прерывания SDIO программа оказывается в BusFault_Handler. Глюк происходит изредка и нерегулярно.
В окне Callstuck картина каждый раз одинаковая, глюк где-то в коде ядра ОС
Если установку эвентов в прерывании заменить на глобальную переменную, а ожидание эвентов на проверку этой переменной в цикле while , то глюка не происходит.
Приоритет прерывания 12.
FreeRTOS настроена так :
Код
#define configKERNEL_INTERRUPT_PRIORITY 255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for(;; ); } /*проходит не ругается */
Обработчик прерывания
Код
void SDIO_IRQHandler(void)
{
static portBASE_TYPE xHigherPriorityTaskWoken;
static unsigned int SDIO_STA_MASK;
xHigherPriorityTaskWoken = pdFALSE;
SDIO_STA_MASK=SDIO->STA & 0x00ffffff; //т.к. в EventGroup можно передавать только 24 бита
xEventGroupSetBitsFromISR(x_SDIO_Transmit_EventGroup, SDIO_STA_MASK ,&xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken == pdTRUE);
SDIO->ICR= SDIO_STA_MASK; //сбрасываем флаги прерывания //
xxxx=123; //Глобальная переменная для поиска места глюка
}
Эскизы прикрепленных изображений