硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4208|回复: 4
收起左侧

[有问必答] FreeRTOS堆栈设置导致任务不执行切换

[复制链接]

3

主题

8

回帖

17

积分

新手上路

积分
17
发表于 2018-7-9 08:30:16 | 显示全部楼层 |阅读模式
我使用的STM32F103VE运行的STM32CubeMX生成的freertos工程。
一共有两个任务,TSAK1和TASK2都是翻转LED,TASK1的堆栈设置64,两个任务切换、运行正常。但是TASK1任务堆栈更改为128的话,就不执行任务切换,只有TASK1的任务在运行
代码如下
  1. #define START_TASK_PRIO 1
  2. #define START_STK_SIZE  128
  3. TaskHandle_t StartTask_Handle;

  4. #define TASK1_TASK_PRIO 2
  5. #define TASK1_STK_SIZE  64
  6. TaskHandle_t Task1Task_Handle;

  7. #define TASK2_TASK_PRIO 3
  8. #define TASK2_STK_SIZE  64
  9. TaskHandle_t Task2Task_Handle;
复制代码
  1. void start_task(void *pvParameters)
  2. {
  3.   taskENTER_CRITICAL();
  4.   
  5. /*
  6.         xTaskCreate( (TaskFunction_t) key_task,
  7.               (const char *  ) "key task",
  8.               (const uint16_t) KEY_STK_SIZE,
  9.               (void *        ) NULL,
  10.               (UBaseType_t   ) KEY_TASK_PRIO,
  11.               (TaskHandle_t *) &KEYTask_Handle );
  12. */
  13.         
  14.   xTaskCreate( (TaskFunction_t) task1_task,
  15.               (const char *  ) "task1 task",
  16.               (const uint16_t) TASK1_STK_SIZE,
  17.               (void *        ) NULL,
  18.               (UBaseType_t   ) TASK1_TASK_PRIO,
  19.               (TaskHandle_t *) &Task1Task_Handle );

  20.                                                         
  21.   xTaskCreate( (TaskFunction_t) task2_task,
  22.               (const char *  ) "task2 task",
  23.               (const uint16_t) TASK2_STK_SIZE,
  24.               (void *        ) NULL,
  25.               (UBaseType_t   ) TASK2_TASK_PRIO,
  26.               (TaskHandle_t *) &Task2Task_Handle );

  27.                                                         
  28.   vTaskDelete(StartTask_Handle);
  29.   
  30.   taskEXIT_CRITICAL();
  31. }

  32. void task1_task(void *pvParameters)
  33. {
  34.   while(1)
  35.   {
  36.     HAL_GPIO_TogglePin(GPIOD,LED2_Pin);
  37.     osDelay(200);
  38.   }
  39. }

  40. void task2_task(void *pvParameters)
  41. {
  42.   while(1)
  43.   {
  44.     HAL_GPIO_TogglePin(GPIOD,LED1_Pin);
  45.     osDelay(200);
  46.   }
  47. }
复制代码
  1. int main(void)
  2. {

  3.   HAL_Init();

  4.   SystemClock_Config();

  5.   MX_GPIO_Init();

  6.   MX_FREERTOS_Init();

  7.         xTaskCreate( (TaskFunction_t) start_task,
  8.               (const char *  ) "start task",
  9.               (const uint16_t) START_STK_SIZE,
  10.               (void *        ) NULL,
  11.               (UBaseType_t   ) START_TASK_PRIO,
  12.               (TaskHandle_t *) &StartTask_Handle );
  13.   /* Start scheduler */
  14.   osKernelStart();

  15.   while (1)
  16.   {

  17.   }

  18. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2018-7-9 09:01:47 | 显示全部楼层
特别注意CubeMX 使用的FreeRTOS是强制开启了CMSIS-RTOS V1封装层的,加上这个封装层的话,默认情况下main函数也是一个任务。

API的时候不要再使用FreeRTOS自己的了,要使用CMSIS-RTOS的,详情看你CMSIS-RTOS V1封装层的help文档学习。这个V1封装层,我自己基本不用,不太熟悉,所以你看文档研究下
回复

使用道具 举报

3

主题

8

回帖

17

积分

新手上路

积分
17
 楼主| 发表于 2018-7-10 08:10:21 | 显示全部楼层
eric2013 发表于 2018-7-9 09:01
特别注意CubeMX 使用的FreeRTOS是强制开启了CMSIS-RTOS V1封装层的,加上这个封装层的话,默认情况下main函 ...

大神就是牛,果然是这样的
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2018-8-26 10:34:22 | 显示全部楼层
我觉得是FreeRTOS堆设置的太少了,TASK2就不够堆来创建,故TASK2根本就没有创建 成功。
FreeRTOS的任务创建时填写的堆大小是4倍字节的。
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2018-8-27 09:50:13 | 显示全部楼层
dodo55 发表于 2018-8-26 10:34
我觉得是FreeRTOS堆设置的太少了,TASK2就不够堆来创建,故TASK2根本就没有创建 成功。
FreeRTOS的任务创 ...

我表示我在不同的栈中并没有发生问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 23:26 , Processed in 0.195462 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表