STM32
直播中

王超

7年用户 1225经验值
私信 关注
[问答]

STM32F103VE运行的STM32CubeMX生成的freertos工程,FreeRTOS堆栈设置导致任务不执行切换怎么解决?

我使用的STM32F103VE运行的STM32CubeMX生成的freertos工程。
一共有两个任务,TSAK1和TASK2都是翻转LED,TASK1的堆栈设置64,两个任务切换、运行正常。但是TASK1任务堆栈更改为128的话,就不执行任务切换,只有TASK1的任务在运行
代码如下

  • #define START_TASK_PRIO 1
  • #define START_STK_SIZE  128
  • TaskHandle_t StartTask_Handle;

  • #define TASK1_TASK_PRIO 2
  • #define TASK1_STK_SIZE  64
  • TaskHandle_t Task1Task_Handle;

  • #define TASK2_TASK_PRIO 3
  • #define TASK2_STK_SIZE  64
  • TaskHandle_t Task2Task_Handle;


  • void start_task(void *pvParameters)
  • {
  •   taskENTER_CRItiCAL();

  • /*
  •         xTaskCreate( (TaskFunction_t) key_task,
  •               (const char *  ) "key task",
  •               (const uint16_t) KEY_STK_SIZE,
  •               (void *        ) NULL,
  •               (UBaseType_t   ) KEY_TASK_PRIO,
  •               (TaskHandle_t *)  KEYTask_Handle );
  • */

  •   xTaskCreate( (TaskFunction_t) task1_task,
  •               (const char *  ) "task1 task",
  •               (const uint16_t) TASK1_STK_SIZE,
  •               (void *        ) NULL,
  •               (UBaseType_t   ) TASK1_TASK_PRIO,
  •               (TaskHandle_t *)  Task1Task_Handle );


  •   xTaskCreate( (TaskFunction_t) task2_task,
  •               (const char *  ) "task2 task",
  •               (const uint16_t) TASK2_STK_SIZE,
  •               (void *        ) NULL,
  •               (UBaseType_t   ) TASK2_TASK_PRIO,
  •               (TaskHandle_t *)  Task2Task_Handle );


  •   vTaskDelete(StartTask_Handle);

  •   taskEXIT_CRITICAL();
  • }

  • void task1_task(void *pvParameters)
  • {
  •   while(1)
  •   {
  •     HAL_GPIO_TogglePin(GPIOD,LED2_Pin);
  •     osDelay(200);
  •   }
  • }

  • void task2_task(void *pvParameters)
  • {
  •   while(1)
  •   {
  •     HAL_GPIO_TogglePin(GPIOD,LED1_Pin);
  •     osDelay(200);
  •   }
  • }


  • int main(void)
  • {

  •   HAL_Init();

  •   SystemClock_Config();

  •   MX_GPIO_Init();

  •   MX_FREERTOS_Init();

  •         xTaskCreate( (TaskFunction_t) start_task,
  •               (const char *  ) "start task",
  •               (const uint16_t) START_STK_SIZE,
  •               (void *        ) NULL,
  •               (UBaseType_t   ) START_TASK_PRIO,
  •               (TaskHandle_t *)  StartTask_Handle );
  •   /* Start scheduler */
  •   osKernelStart();

  •   while (1)
  •   {

  •   }

  • }

回帖(1)

胡皓

2024-4-26 16:25:02
线程的堆栈上面已经define过了,操作系统的堆栈使用的是默认的,应该是够的。
后面经过eric2013的指点,是使用cubemx配置的Free RTOS,强制开启了CMSIS-RTOS V1封装层,任务函数就不能使用Free RTOS自己的函数了,需要使用CMSIS-RTOS的。
经过确认和更改,任务已经可以切换了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分