首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何产生延迟

问如何产生延迟
EN

Stack Overflow用户
提问于 2011-11-22 01:35:59
回答 2查看 787关注 0票数 1

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

代码语言:javascript
复制
#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的处理器怎么能立即执行上面的代码而没有任何明显的延迟呢?

EN

回答 2

Stack Overflow用户

发布于 2011-11-22 02:05:00

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

要真正获得10秒(非繁忙)的延迟,您可以这样做:

代码语言:javascript
复制
#include <linux/sched.h>
//...

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

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

或者更好:

代码语言:javascript
复制
#include <linux/delay.h>
//...

msleep(10 * 1000);

对于较短的延迟,可以使用mdelay、ndelay和udelay

我建议您阅读Linux Device Drivers 3rd edition chapter 7.3,它处理延迟以获取更多信息

票数 2
EN

Stack Overflow用户

发布于 2011-11-22 01:41:54

要直接回答这个问题,很可能是你的编译器看到这些循环什么都不做,然后“优化”它们。

至于这项技术,看起来你想要做的是使用所有的处理器来创建延迟。虽然这可能会起作用,但操作系统应该设计为最大限度地利用处理器时间。这只会浪费它。

我知道这是试验性的,但这只是小题大做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8215984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档