【问题标题】:Im trying to Implement a Mutex in FreeRTOS using arduino but my output isnt coming out right我正在尝试使用 arduino 在 FreeRTOS 中实现互斥锁,但我的输出不正确
【发布时间】:2023-02-23 07:25:17
【问题描述】:

在这里我定义了句柄和任务原型

void Task1(void *p);
void Task2(void *p);

TaskHandle_t Task1_handle;
TaskHandle_t Task2_handle;
SemaphoreHandle_t myMutex;

这是具有任务和互斥创建功能的设置功能

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  myMutex = xSemaphoreCreateMutex();
  if(myMutex == NULL)
  {
    Serial.println("Mutex cannot be created");
  }
  xTaskCreate(Task1, "Task 1", 100, NULL, 1, &Task1_handle);
  xTaskCreate(Task2, "Task 2", 100, NULL, 1, &Task2_handle);
  vTaskStartScheduler();
}

void loop() {
  // put your main code here, to run repeatedly:

}

这是我创建的任务

void Task1(void *p)
{
  (void) p;
  while(1)
  {
    xSemaphoreTake(myMutex, portMAX_DELAY);
    Serial.println("task 1");
    for(int i = 0; i < 5; i++)
    {
      Serial.println(i);
      vTaskDelay(500 / portTICK_PERIOD_MS);
    }
    xSemaphoreGive(myMutex);
  }
}

void Task2(void *p)
{
  (void) p;
  while(1)
  {
    xSemaphoreTake(myMutex, portMAX_DELAY);
    Serial.println("task 2");
    for(int i = 0; i < 5; i++)
    {
      Serial.println(i);
      vTaskDelay(500 / portTICK_PERIOD_MS);
    }
    xSemaphoreGive(myMutex);
  }
}

到目前为止,这是我的代码,但我似乎没有在串行监视器上完成我的第二个任务:Serial Monitor Output

我使用的信号量功能错了吗?

【问题讨论】:

    标签: c++ arduino mutex freertos


    【解决方案1】:

    当 Task 1 处于休眠状态时互斥锁被锁定,因此 Task 2 永远无法获得互斥锁。由互斥量保护的部分应尽可能短,例如:

    void Task1(void *p)
    {
        (void)p;
        while (1) {
            xSemaphoreTake(myMutex, portMAX_DELAY);
            Serial.println("task 1");
            xSemaphoreGive(myMutex);
            for (int i = 0; i < 5; i++) {
                xSemaphoreTake(myMutex, portMAX_DELAY);
                Serial.println(i);
                xSemaphoreGive(myMutex);
                vTaskDelay(500 / portTICK_PERIOD_MS);
            }
        }
    }
    

    以同样的方式修改任务 2。

    【讨论】:

      【解决方案2】:

      虽然我可以看到@armandas 的建议将走向何方,但我确信结果不会是@averean 的原始问题所暗示的。 在这个问题中,人们可能期望任务 1 和任务 2 交替打印 5 行:0 到 4。事实上,我对古代 VRTX 的体验会导致这种情况。 一旦 Task 1 第一次调用 vTaskDelay(),Task 2 肯定会到达它对 xSemaphoreTake() 的阻塞调用,如果它还没有这样做的话。这应该将其置于准备运行状态,等待返回信号量。 好吧,任务 1 正在运行,当 give 发生时,但任务 2 肯定需要上下文切换,特别是因为它已经耐心地等待了 2.5 秒! 因此,我的问题是为什么执行者不释放一直在等待互斥锁的任务2?

      【讨论】:

      最近更新 更多