如何在 RTOS 中确保 Task1 完成然后 Task2 开始(我们不知道调度算法)?

How to make sure in RTOS that Task1 finish then Task2 start (we don't know scheduling algorithm )?

下面的问题在多次面试中问了我很多次,每次我都答不上来。

假设单处理器系统中的RTOS 运行。其中有两个任务。任务 1 打印数据 "Up",任务 2 打印数据 "Down"。你如何确保 Task1 先打印然后 Task2?所以输出如下

向上 吃下 向上 吃下 .....

我建议使用全局变量的机制,例如初始全局变量的值为 1。例如。 int globaleVar = 1; 现在两个任务写成下面这样

任务 1

while(1)
{
    if(globaleVar == 1)
    {
        printf("Up");
        globaleVar = 2;
    }

}

任务 2

while(1)
{
    if(globaleVar == 2)
    {
        printf("Down");
        globaleVar = 1;
    }

}

但是他们说如果 Task2 在变量从 Task1 更新之前获得机会怎么办?为什么不尝试使用信号量呢?

所以我不知道如何使用信号量?有人知道吗?

对于 FreeRTOS,您可以使用互斥锁 Mutexes 要么 Event groups

在 RTOS 环境中执行此操作的一种自然方法是使用两个二进制信号量,每个任务一个。在伪代码中:

BinarySempahore up, dn;

void task_up(void) {
  while (1) {
    wait(up);
    printf("UP ");
    signal(dn);
  }
}

void task_dn(void) {
  while (1) {
    wait(dn);
    printf("DOWN ");
    signal(up);
  }
}

void main(void) {
  dn = create_binary_sempahore(0);
  up = create_binary_semaphore(1);
  start_task(task_dn);
  start_task(task_up);
}

最初任务 dnwait 中阻塞,因为它的信号量值为零,但是 up 运行,打印它的消息,唤醒 dn,然后阻塞在它的自己的信号量,现在为零。任务 dn 现在已从 wait 解除阻塞,因此打印其消息,唤醒 up,然后阻塞 its sempahore,等等