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

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
好奇,坐等答案
wolfgang 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版