我是内核编程的新手,我正在尝试理解一些操作系统的基础知识。我试图使用我在20Mhz微控制器中成功实现的技术来产生延迟。 我知道这是一个完全不同的环境,因为我在我的2 GHz Core 2 duo处理器中使用了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处理器如何在没有任何明显延迟的情况下立即执行上述代码?
答案 0 :(得分:2)
编译器正在优化你的循环,因为它没有副作用。
要实际获得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
,ndelay
和udelay
我建议你阅读Linux Device Drivers 3rd edition chapter 7.3,其中涉及更多信息的延迟
答案 1 :(得分:1)
要直接回答这个问题,很可能你的编译器发现这些循环没有做任何事情并且“优化”它们。
至于这种技术,你想要做的就是使用所有处理器来创建延迟。虽然这可能有效,但应设计操作系统以最大化处理器时间。这只会浪费它。
我知道这是实验性的,但只是抬头。