как сгенерировать задержку - PullRequest
1 голос
/ 21 ноября 2011

Я новичок в программировании ядра и пытаюсь понять некоторые основы ОС.Я пытаюсь сгенерировать задержку, используя технику, которую я успешно реализовал в 20 МГц микроконтроллере.Я знаю, что это совершенно другая среда, поскольку я использую linux centOS в моем 2-ГГц процессоре Core 2 Duo.Я попробовал следующий код, но не получаю задержку.

#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 после установки модуля так быстро, как это возможно для меня, строка "привет" уже там.Если мои расчеты верны, приведенный выше код должен дать мне как минимум 10 секундную задержку.Почему это не работает?Есть что-нибудь связанное с потоками?Как процессор с частотой 20 ГГц может выполнить вышеуказанный код мгновенно, без заметной задержки?

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Компилятор оптимизирует ваш цикл, поскольку он не имеет побочных эффектов.

Чтобы фактически получить 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, третье издание, глава 7.3 , в которой рассматриваются задержки для получения дополнительной информации

1 голос
/ 21 ноября 2011

Чтобы ответить на вопрос напрямую, ваш компилятор, вероятно, видит, что эти циклы ничего не делают, и "оптимизирует" их.

Что касается этой техники, то похоже, что вы пытаетесь сделать, это использовать весь процессор для создания задержки. Хотя это может работать, ОС должна быть спроектирована таким образом, чтобы максимально увеличить время процессора. Это просто потратит впустую.

Я понимаю, что это экспериментально, но только на голову.

...