wanyisq 发表于 2018-7-9 08:14:43

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

本帖最后由 wanyisq 于 2018-7-9 08:18 编辑

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

#define TASK1_TASK_PRIO 2
#define TASK1_STK_SIZE64
TaskHandle_t Task1Task_Handle;

#define TASK2_TASK_PRIO 3
#define TASK2_STK_SIZE64
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)
{

}

}

海迹天涯 发表于 2018-7-9 08:52:44

好奇,坐等答案

wolfgang2015 发表于 2018-7-9 14:55:50

看看FreeRTOS 配置, 你给线程运行的Heap大小多少?

jakecumt 发表于 2018-7-12 10:04:01

是因为操作系统的堆栈配置小了。configTOTAL_HEAP_SIZE 看看这个配置是不是过小?

wanyisq 发表于 2018-7-12 10:38:27

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

hpdell 发表于 2018-7-25 16:51:51

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

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

就这样结贴了

kanson4 发表于 2018-9-3 01:58:48

我也遇到相同问题,很多天了,请问要怎样使用CMSIS-RTOS解决?谢谢
页: [1]
查看完整版本: FreeRTOS堆栈设置导致任务不执行切换