FreeRtos stm32f4 atascado en vTaskDelay

1

Hola, estoy usando FreeRtos API con el microcontrolador stm32f4, el programa se atasca cuando ingresa vTaskDelay, cuando lo depuro veo que está atascado en esta línea (2588 de tasks.c en la función vTaskDelay)

            if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) 1 )
        {
            taskYIELD();
        }

muchas gracias por tu ayuda

    
pregunta werber bang

2 respuestas

2

encontré la razón por la que ocurrió este error es solo que el tiempo no parece avanzar porque la interrupción del systick fue como no hacer nada, y esto porque usé un FreeRTOSConfig.h generado con stmcube y comenté lo siguiente

/* IMPORTANT: This define MUST be commented when used with STM32Cube firmware, 
to prevent overwriting SysTick_Handler defined within STM32Cube HAL */
/* #define xPortSysTickHandler SysTick_Handler*/

, lo descomprimí, también tuve que comentar la definición de la interrupción del systick en stm32f4xx__it.c para evitar la definición duplicada

    
respondido por el werber bang
0

Con STM32Cube_FW_F4_V1.13.1 y FreeRTOS V8.2.3 necesita definir el símbolo USE_RTOS_SYSTICK .

Aquí hay un ejemplo de trabajo:

#include "stm32f4xx.h"
#include "stm32f4xx_nucleo_144.h"

// don't forget to define USE_RTOS_SYSTICK globally!

#include <cmsis_os.h>

#define LED_PIN     GPIO_PIN_0
#define LED_PORT        GPIOB

void blinky_task( void* pvParameters)
{
    for(;;)
    {
        vTaskDelay( 1000 / portTICK_PERIOD_MS);
        HAL_GPIO_WritePin( LED_PORT, LED_PIN, GPIO_PIN_SET);

        vTaskDelay( 200  / portTICK_PERIOD_MS);
        HAL_GPIO_WritePin( LED_PORT, LED_PIN, GPIO_PIN_RESET);
    }
}

int main(void)
{
    HAL_Init();
    __HAL_RCC_GPIOB_CLK_ENABLE();

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pin  = LED_PIN;
    HAL_GPIO_Init( LED_PORT, &GPIO_InitStructure);

    xTaskCreate( blinky_task, (char*) "blinky", configMINIMAL_STACK_SIZE, 0, 1, 0);
    vTaskStartScheduler();
}
    
respondido por el frank

Lea otras preguntas en las etiquetas