gpt4 book ai didi

multithreading - 如何产生延迟

转载 作者:行者123 更新时间:2023-12-03 13:21:27 25 4
gpt4 key购买 nike

我是内核编程的新手,我正在尝试了解操作系统的一些基础知识。我正在尝试使用我在 20Mhz 微 Controller 中成功实现的技术来产生延迟。
我知道这是一个完全不同的环境,因为我在我的 2 GHz Core 2 双核处理器中使用 linux centOS。
我已经尝试了以下代码,但没有延迟。

#include<linux/kernel.h>
#include<linux/module.h>

int init_module (void)
{
unsigned long int i, j, k, l;

for (l = 0; l < 100; l ++)
{
for (i = 0; i < 10000; i ++)
{
for ( j = 0; j < 10000; j ++)
{
for ( k = 0; k < 10000; k ++);
}
}
}

printk ("\nhello\n");

return 0;
}

void cleanup_module (void)
{
printk ("bye");
}

当我尽可能快地插入模块后 dmesg 时,字符串“hello”已经存在。如果我的计算是正确的,上面的代码应该给我至少 10 秒的延迟。
为什么它不起作用?有什么与线程有关的吗? 20 Ghz 处理器如何能够立即执行上述代码而没有任何明显的延迟?

最佳答案

编译器正在优化您的循环,因为它没有副作用。

要实际获得 10 秒(非忙碌)延迟,您可以执行以下操作:

#include <linux/sched.h>
//...

unsigned long to = jiffies + (10 * HZ); /* current time + 10 seconds */

while (time_before(jiffies, to))
{
schedule();
}

或者更好:
#include <linux/delay.h>
//...

msleep(10 * 1000);

对于短暂的延迟,您可以使用 mdelay , ndelayudelay
我建议你阅读 Linux Device Drivers 3rd edition chapter 7.3 ,它处理延迟以获取更多信息

关于multithreading - 如何产生延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8215984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com