c - 如何确保在 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 更新变量之前获得机会怎么办?为什么不尝试使用信号量?
所以我不知道如何使用信号量?有人知道吗?
解决方案
在 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
,然后阻塞它的信号量,等等,等等。
推荐阅读
- javascript - 从 Fetch 请求中合并多个对象
- amazon-web-services - 自动将 Linux EC2 实例安全地加入托管 AD 域
- ruby-on-rails - Rails:通过Kong(Heroku)转发的请求没有路由匹配错误
- javascript - regex - 查找 HTML 格式文本中的所有数字
- python - 全局 eventFilter 不会在 Qt 中的 QThread 中捕获目标事件
- r - if (length(scores.temp) == 1 && scores.temp == 0) { 中的错误:需要 TRUE/FALSE 的缺失值
- arrays - 在 Dart/Flutter 中反序列化 json 数组
- mysql - 将错误消息列值与查询中使用的列名匹配
- javascript - 预加载器在某些浏览器中不会停止。如何解决这个问题?
- python - 尝试连接到无效的主机和端口时,我的程序崩溃