你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

FreeRTOS堆栈设置导致任务不执行切换

[复制链接]
wanyisq 提问时间:2018-7-9 08:14 /
本帖最后由 wanyisq 于 2018-7-9 08:18 编辑

我使用的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. }
复制代码

收藏 评论6 发布时间:2018-7-9 08:14

举报

6个回答
海迹天涯 回答时间:2018-7-9 08:52:44
好奇,坐等答案
wolfgang2015 回答时间:2018-7-9 14:55:50
看看FreeRTOS 配置, 你给线程运行的Heap大小多少?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

jakecumt 回答时间:2018-7-12 10:04:01
是因为操作系统的堆栈配置小了。configTOTAL_HEAP_SIZE 看看这个配置是不是过小?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

wanyisq 回答时间:2018-7-12 10:38:27
线程的堆栈上面已经define过了,操作系统的堆栈使用的是默认的,应该是够的。
后面经过eric2013的指点,是使用cubemx配置的Free RTOS,强制开启了CMSIS-RTOS V1封装层,任务函数就不能使用Free RTOS自己的函数了,需要使用CMSIS-RTOS的。
经过确认和更改,任务已经可以切换了。
结帖 感谢

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4 结帖奖励

查看全部评分

hpdell 回答时间:2018-7-25 16:51:51
wanyisq 发表于 2018-7-12 10:38
线程的堆栈上面已经define过了,操作系统的堆栈使用的是默认的,应该是够的。
后面经过eric2013的指点,是 ...

没有说是修改哪里,如何修改的,哎,

就这样结贴了

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

kanson4 回答时间:2018-9-3 01:58:48
我也遇到相同问题,很多天了,请问要怎样使用CMSIS-RTOS解决?谢谢

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版