Systick en interrupción usando FreeRTOS

0

Necesito contar cuántos milisegundos demora mi interrupción para finalizar su servicio. Antes de comenzar a usar FreeRTOS, simplemente hice algo como esto:

void HAL_GPIO_EXTI_Callback(void)
{
    uint32_t diff;
    start = HAL_GetTick();
    // do anything
    diff = HAL_GetTick() - start;
}

Pero cuando comencé a usar FreeRTOS, el valor de HAL_GetTick dejó de cambiar, por otra parte Syrup Interrupt no funciona, por lo que no hay posibilidad de aumentar el valor de tick. ¿Alguna idea sobre qué debo hacer para que Systick Handler vuelva a funcionar en interrupción u otra solución para poder medir el tiempo en interrupción?

    
pregunta m0drzew

2 respuestas

4

Los milisegundos son demasiado largos para pasar dentro de una interrupción, especialmente cuando se utiliza un RTOS. Si interrumpe la rutina de servicio es tan largo que recomendaría encarecidamente aplazar el procesamiento a una tarea .

FreeRTOS utiliza el propio temporizador SysTick, como probablemente cualquier RTOS que se ejecute en una parte ARM Cortex-M. Además, las propias bibliotecas de STM 32 utilizan FreeRTOS, y el controlador de interrupción HAL SysTick de STM32 llama a sus propias rutinas de sincronización antes de llamar al administrador de FreeRTOS SysTick, por lo que SysTick no está disponible para el escritor de la aplicación. Sin embargo, hay muchos otros temporizadores periféricos que puede utilizar.

    
respondido por el Richard
1

Al igual que en FreeRTOS para STM32, en el archivo de inicio, el puntero del vector del controlador de interrupción de Systick apunta a la función requerida por FreeRTOS para su propio uso, es decir, xPortSysTickHandler. Aquí FreeRTOS configura los ticks requeridos para RTOS para su ejecución.

Por lo tanto, no puedes usar systick para ninguna otra tarea.

Como dijo Richard, puede usar otras rutinas basadas en la interrupción del temporizador para el requisito de la aplicación.

    
respondido por el user2118599

Lea otras preguntas en las etiquetas