【问题标题】:FreeRTOS - creating a task in place of another task?FreeRTOS - 创建一个任务来代替另一个任务?
【发布时间】:2021-04-27 00:19:37
【问题描述】:

我正在使用heap_1 内存分配。有一个初始化任务Task_ini,从中启动了两个任务Task_1Task_2。然后我删除Task_ini。在Task_1 的某个时间点,我需要创建一个新任务Task_3。如何在 FreeRTOS 堆中创建 Task_3 来代替当时已经被删除的 Task_ini,只知道它的 TaskHandle_t

int main(void){
  xTaskCreate(Task_ini, "Task_ini", configMINIMAL_STACK_SIZE, NULL, 1, &htask_ini);
  vTaskStartScheduler();    
  for(;;);
}
void Task_ini(void *pParams){   
  xTaskCreate(Task_function, "Task_1", configMINIMAL_STACK_SIZE, &param1, 1, &htask1);
  xTaskCreate(Task_function, "Task_2", configMINIMAL_STACK_SIZE, &param2, 1, &htask2);
  vTaskDelete(NULL);
}
void Task_function(void *pParams){
  for(;;){
    //task code
    //...
    //end task code
    if(create == true){
      create = false;
//Here I need to create a task at the address where the "Task_ini" task was.
//My code creates a task in a new heap section, and if there is no space it will cause a memory allocation error.
      xTaskCreate(Task_function, "Task_3", configMINIMAL_STACK_SIZE, &param3, 1, &htask3);
    }
  }
}

【问题讨论】:

    标签: freertos


    【解决方案1】:

    heap_1 的主要思想是你不能释放内存。它根本没有能力这样做。如果要删除任务,需要使用其他heap_n方法。即使在这种情况下,您也应该让内核完成它的工作:管理 FreeRTOS 对象的内存是内核的工作,而不是您的。

    实际上,一般来说,删除任务并不是一种好的做法。除非您的堆空间真的很低,否则您可以简单地暂停任务。这样,在再次需要它的服务时,您可以免费再次唤醒它。

    确实,一个init任务在系统初始化之后就变得没用了。但是对于您的 init 任务问题,有一个众所周知的解决方案:它可以在完成初始化序列后演变为另一个任务。例如,Task_ini 只能创建 Task_2,而不是创建 Task_1,它可以执行 Task_1'工作本身。

    更新:

    为 FreeRTOS 对象管理内存是内核的工作,而不是你的。

    实际上,FreeRTOS 允许您手动管理内存,如果您愿意的话。对象创建函数有静态版本,例如xTaskCreateStatic()。使用这些静态版本时,您将两个静态分配的缓冲区传递给任务堆栈和任务控制块 (TCB) 的函数。然后,您实际上可以将一项任务放在另一项任务上(前提是它已被删除)。为了能够使用这些函数,configSUPPORT_STATIC_ALLOCATION 必须定义为1

    但我建议您避免手动管理内存,除非您有特定的理由这样做。

    【讨论】:

    • Task_ini中,我只需要等待create事件并运行Task_function(&param3)
    • 是的,这应该可以。但由于保存返回地址,它可能会使用额外的堆栈内存。如果您没有对两个任务使用相同的函数,您可以在创建 Task_2 之后放置一个无限循环,而不是跳入任务函数。
    • 我明白了。我有这样一个例子,因为我的任务是同一个函数,只是参数不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多