首页 > 解决方案 > 如何确保在 RTOS 中 Task1 完成然后 Task2 启动(我们不知道调度算法)?

问题描述

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

假设 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 更新变量之前获得机会怎么办?为什么不尝试使用信号量?

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

标签: cmultithreadingrtos

解决方案


在 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);
}

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


推荐阅读