下面的问题在多次面试中多次问过我,每次我困惑地给出正确答案时都会问我。
假设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更新变量之前获得机会,该怎么办?为什么不尝试使用信号量?
所以我不知道使用信号量怎么可能?有人知道吗?
答案 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);
}
最初,任务dn
在wait
中阻塞,因为其信号量值为零,但是up
运行,打印其消息,唤醒dn
,然后根据其自身的信号量阻塞,现在为零。现在,任务dn
已从wait
取消阻止,因此打印其消息,唤醒up
,然后在 sempahore等上阻止,依此类推,等等。
答案 1 :(得分:0)
对于FreeRTOS,您可以使用互斥锁Mutexes 要么 Event groups