我是内核编程的新手,我正在尝试理解一些操作系统的基础知识。我正在尝试使用一种我已经在20‘ve微控制器中成功实现的技术来产生延迟。我知道这是一个完全不同的环境,因为我在我的2 GHz Core2 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的处理器怎么能立即执行上面的代码而没有任何明显的延迟呢?
发布于 2011-11-22 02:05:00
编译器正在优化你的循环,因为它没有副作用。
要真正获得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,它处理延迟以获取更多信息
发布于 2011-11-22 01:41:54
要直接回答这个问题,很可能是你的编译器看到这些循环什么都不做,然后“优化”它们。
至于这项技术,看起来你想要做的是使用所有的处理器来创建延迟。虽然这可能会起作用,但操作系统应该设计为最大限度地利用处理器时间。这只会浪费它。
我知道这是试验性的,但这只是小题大做。
https://stackoverflow.com/questions/8215984
复制相似问题