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

时间:2019-11-20 04:29:47

标签: c multithreading rtos

下面的问题在多次面试中多次问过我,每次我困惑地给出正确答案时都会问我。

假设RTOS在单处理器系统中运行。其中有两个任务。 Task1打印类似“ Up”的数据,而Task2打印类似“ 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更新变量之前获得机会,该怎么办?为什么不尝试使用信号量?

所以我不知道使用信号量怎么可能?有人知道吗?

2 个答案:

答案 0 :(得分:4)

在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,然后在 sempahore等上阻止,依此类推,等等。

答案 1 :(得分:0)

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