如何在 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);
}
最初任务 dn
在 wait
中阻塞,因为它的信号量值为零,但是 up
运行,打印它的消息,唤醒 dn
,然后阻塞在它的自己的信号量,现在为零。任务 dn
现在已从 wait
解除阻塞,因此打印其消息,唤醒 up
,然后阻塞 its sempahore,等等
下面的问题在多次面试中问了我很多次,每次我都答不上来。
假设单处理器系统中的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);
}
最初任务 dn
在 wait
中阻塞,因为它的信号量值为零,但是 up
运行,打印它的消息,唤醒 dn
,然后阻塞在它的自己的信号量,现在为零。任务 dn
现在已从 wait
解除阻塞,因此打印其消息,唤醒 up
,然后阻塞 its sempahore,等等