【问题标题】:How can I modify task callback_function FreeRTOS?如何修改任务 callback_function FreeRTOS?
【发布时间】:2021-02-05 05:29:12
【问题描述】:

下面的代码 sn-p 创建了两个任务,即尝试打印单词。任务 2 已创建 具有更高的优先级。因为这两个任务都在无限循环中运行并且不放弃 自愿开始时间,那么任务 1 永远不会得到(开始时间......如果这是正确的话)。

如何修改“任务 2”回调函数,“任务 1”也将获得开始时间?

void vTaskFunction ( void *pvParameters ) {
      for( ;; ) {
            vPrintString((char *) pvParameters );
      }
}

static const char *pcTextForTask1 = "Task 1 is running\r\n";
static const char *pcTextForTask2 = "Task 2 is running\r\n";

int main( void ) {
      /* ...MCU initialization...*/
      xTaskCreate( vTaskFunction, "Task 1", 1000, (void*)pcTextForTask1, 1, NULL ); // Task with priority 1
      xTaskCreate( vTaskFunction, "Task 2", 1000, (void*)pcTextForTask2, 2, NULL ); // Task with priority 2
      vTaskStartScheduler();

      for( ;; );
}

我希望这是有道理的

【问题讨论】:

  • 这是期望的行为吗?为什么不更改configUSE_PREEMPTION?您想要获得什么行为?您希望多久运行一次其他函数?为什么不vTaskDelay(10)
  • 这是完全可以预料的,一个永远运行的高优先级任务会阻塞任何低优先级的任务。您需要考虑一种方法来为这些优先级较低的任务留出时间。延迟是一种方式。

标签: c stm32 freertos


【解决方案1】:

您的代码完全按照您的要求执行 - 尽可能频繁地打印给定的字符串。因为任务 2 的优先级高于任务 1,而且它总是有“工作”要做,所以任务 1 没有时间了。

真正的问题是 - 您期望的行为是什么?从您编写的代码中,我看不出预期行为应该是什么的明确原因,因为其中一项任务的优先级高于另一项。任务 2 是否应该比任务 1 更频繁地打印字符串?如果是,如何定义“更频繁”?

如果您希望这两个任务都有时间“工作”,那么您有以下选择:

  • 为两个任务分配相同的优先级并以抢占式配置运行,

  • vTaskDelay(time) 添加到更高优先级的任务(任务 2)。在这种情况下,您将使任务 2 休眠给定的时间,较低优先级的任务(任务 1)将使用该时间来完成其工作。在这种情况下,任务 1 将尽可能多地完成工作(打印尽可能多的字符串)。一旦这个时间结束,它将被抢占,并且将在任务 2 中继续执行,直到下一次延迟发生,

  • 在任务(信号量、队列...)之间添加某种同步。例如,您可以添加两个信号量:SemaphoreA 和 SemaphoreB。在这种情况下,任务 1 可以:等待 SemaphoreA -> 打印字符串 -> 提供 SemaphoreB。任务 2:等待 SemaphoreB -> 打印字符串 -> 给 SemaphoreA。这种安排将导致字符串相互交错打印(Task 1 is running -> Task 2 is running -> Task 1 is running -> ...),因为每个任务都会有效地等待另一个任务完成其工作,然后再继续.然而,在这个原因中,任务之间有不同的优先级并没有额外的好处。

【讨论】:

    猜你喜欢
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2015-08-09
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多