LINUX.ORG.RU

точные задержки в ядре


0

0

udelay что хочет то и творит..запросто вместо 500 микросекунд может тормознуть на 1500, замучался уже.

я знаю что udelay спит _как минимум_ заданное время и то что оно может проспать больше чем нужно -- вполне нормально, но как из ситуации то выходить? общаюсь по далласовскому 1-wire протоколу и там задержки довольно критичны..



есть мнение, что подобного рода вещи - это явно не задача PC но промежуточного микроконтроллера a'la UART. в противном случае, это - жопа.

// wbr

klalafuda ★☆☆
()

1. если включить в ядре HPET таймера,
то работать будет сколько надо.
2. realtime патчи
3. написать модуль ядра и такие задачи вынести туда, там есть нужные sleep-ы

max_posedon
()
Ответ на: комментарий от max_posedon

гм. я вобщем-то как раз модуль ядра и делаю.. так что можно поподробнее про пункт 3?

stigger
() автор топика

Я не знаком в деталях с архитектурой ядра, но, как мне кажется, проблему можно решить запретив прерывания на время ожидания (а для вытесняемого ядра и вытеснение запретить). В ядре точно должна быть возможность отмерять зарежки времени без использования внешних прерываний (по крайней мере почти в самом начале загрузки ядра эта вещь калибруется), поэтому задержку там сформировать можно. Не знаю, может это udelay и есть, хотя тоже не факт.

slav ★★
()
Ответ на: комментарий от anonymous

> Делай желесяку, пральна klalafuda говорит.

да не нужно ничего делать. всё уже сто лет как сделано до нас

http://www.elin.ru/1-Wire/?topic=whatis ..ну и так далее.

вывод: берётся любой адаптер подключаемый через USB и проблема решена.

// wbr

klalafuda ★☆☆
()

В качестве примера можно посмотреть тут как реализовать без адаптера:
http://www.kusto.com.ru/temperature/

Если в двух словах - используется com порт на определенной скорости - помоему 115200, на такой скорости если передать 0х00 или 0xff (или принять соответственно) то это как раз соответствует 15 и 60 мс 1-wire. Давно этим занимался - не могу сразу дать ссылку на точное описание но в интернете оно точно есть с примерами кода и схем.

anonymous
()
Ответ на: комментарий от slav

Функция udelay() может быть использована только для выполнения небольших временных задержек, потому что точность переменной loops_per_second составляет только восемь бит, и, при вычислении больших интервалов времени, может накопиться значительная ошибка. Несмотря на то, что максимально допустимая задержка, вычисляемая данной функцией, лежит в пределах одной секунды, рекомендуемый максимум для udelay() составляет 1000 микросекунд (1 миллисекунду). Для вычисления больших интервалов времени используйте функцию mdelay().

можно также посмотреть в сторону Programmable Interval Timer(PIT) - у Daniel Bovet есть глава про синхронизацию ядра :
spin_lock_irqsave(&i8253_lock, flags);
outb_p(0x34,0x43);
udelay(10);
outb_p(LATCH & 0xff, 0x40);
udelay(10);
outb

outb_p в данном случае блокирует прерывания

kto_tama ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.