Embedded 一旦宣布第二个任务,FreeRTOS任务就会陷入困境

Embedded 一旦宣布第二个任务,FreeRTOS任务就会陷入困境,embedded,freertos,Embedded,Freertos,我正在使用VisualGFX为我的STM32F429i发现板开发一个用户界面。VisualGFX内置了freeRTOS,并创建了一个GUITask来处理GUI操作。然后,我尝试使用freeRTOS的xTaskCreate API函数创建一个名为ControllerTask的新任务,该函数与用于创建GUITask的函数相同 然而,当我创建第二个任务时,GUITask就会在我的GUI上显示一些奇怪的值,并且没有任何功能 int main(void){ ... xTaskCre

我正在使用VisualGFX为我的STM32F429i发现板开发一个用户界面。VisualGFX内置了freeRTOS,并创建了一个GUITask来处理GUI操作。然后,我尝试使用freeRTOS的xTaskCreate API函数创建一个名为ControllerTask的新任务,该函数与用于创建GUITask的函数相同

然而,当我创建第二个任务时,GUITask就会在我的GUI上显示一些奇怪的值,并且没有任何功能

    int main(void){
    ...
    xTaskCreate(GUITask, (TASKCREATE_NAME_TYPE)"GUITask",
            configGUI_TASK_STK_SIZE,
            NULL,
            configGUI_TASK_PRIORITY,
            NULL);

    xTaskCreate (ControllerTask, (TASKCREATE_NAME_TYPE)"ControllerTask",
            configController_TASK_STK_SIZE,
            NULL,
            configController_TASK_PRIORITY,
            NULL); 
    vTaskStartScheduler();

    for (;;);
上面的代码显示了这两个任务的创建。GuitTask的优先级高于ControllerTask。下一段代码显示了任务的实现

     static void GUITask(void* params)
      {
          touchgfx::HAL::getInstance()->taskEntry();
      }

     static void ControllerTask(void* params)
     {
       while(1)
       { 
         vTaskDelay(3000);
       }
     }
可以看出,此时ControllerTask的实现只会在每次切换到时将任务延迟大约3秒


但是,GUITask会被卡住,无法进行GUI更新或交互。

基本上可能发生的情况是,taskEntry()函数永远不会返回,因此也不会通过使用vTaskDelay或其他队列调用将处理时间回馈给内核

void taskEntry()虚拟主事件循环。将等待VSYNC 信号,然后处理下一帧。从GUI调用此函数 任务

注意这个函数永远不会返回!在HALSDL2中重新实现,以及 哈尔斯德尔

如果两个任务具有相同的优先级,或者如果您的touchgfx具有更高的优先级,您将被卡住

要解决这个问题,有两种方法

  • 是以优先级执行任务,并将该任务设置为所有任务中优先级最低的任务

  • 启用空闲任务并对该方法实现调用


  • 基本上,可能发生的情况是,taskEntry()函数永远不会返回,因此也不会通过使用vTaskDelay或其他队列调用将处理时间回馈给内核

    void taskEntry()虚拟主事件循环。将等待VSYNC 信号,然后处理下一帧。从GUI调用此函数 任务

    注意这个函数永远不会返回!在HALSDL2中重新实现,以及 哈尔斯德尔

    如果两个任务具有相同的优先级,或者如果您的touchgfx具有更高的优先级,您将被卡住

    要解决这个问题,有两种方法

  • 是以优先级执行任务,并将该任务设置为所有任务中优先级最低的任务

  • 启用空闲任务并对该方法实现调用


  • 您是否检查了
    xTaskCreate
    的返回值?@DKrueger,我没有检查。我该怎么做?应该是什么?你看到了吗……你是在问如何检查函数的返回值吗?这是一个非常基本的C问题,如果您不熟悉C,使用RTOS可能不是最好的起点。您是否阅读过xTaskCreate()的API文档,因为它显示了正在测试的返回值?您还可以实现malloc()failed hook(Google it),如果分配失败,它将被触发,或者根本不使用动态分配。您是否检查了
    xTaskCreate
    的返回值?@DKrueger,我没有检查。我该怎么做?应该是什么?你看到了吗……你是在问如何检查函数的返回值吗?这是一个非常基本的C问题,如果您不熟悉C,使用RTOS可能不是最好的起点。您是否阅读过xTaskCreate()的API文档,因为它显示了正在测试的返回值?您还可以实现malloc()failed hook(googleit),如果分配失败,就会触发它,或者根本不使用动态分配。