Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
миллисекундный интервальный таймер
Yosico
Добавлено 03.06.2009 10:56
0
Сообщение: 1
Yosico
0

Регистрация: 28.05.2009
Здравствуйте. У меня впорос: можно ли под linux реалиовать миллисекундный интервальный таймер? Разрешение реал тайма вроде 10 000 мкс. И насколько это будет точно? Ведь если процесс запускать с высоким приоритетом всеравно возможны задержки за счет критических зон других модулей... И я вроде слышал что частота смены процессов тоже 100Hz, т.е 10 000 мкс...
Нашел такой вариант: http://kerneltrap.org/node/6750
Но как-то пока боюсь за него браться, я с uCLinux работаю недавно...
Обладатель платы LPC2478-S3E.
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 03.06.2009 11:21 Сообщение: 2
Pavel Ivanchenko
Admin
4.39

Пункты: 92788
Регистрация: 24.03.2009
Пол: Мужчина
Думаю, реалтайм в пользовательском пространстве вряд ли получится получить, наверное лучше драйвер таймера написать/поправить - внести в него критичные для RT функции ...
Спуститься к концу Подняться к началу
Персональная информация
sasa
Добавлено 03.06.2009 11:34 Сообщение: 3
sasa
5

Регистрация: 20.05.2009
Лет 5 назад пробовал поуправлять из юзерспейса железякой - требовались задержки более менее точные, ничего не получилось :) на осциллографе полный разброс был виден. Так что linux конечно не панацея для всего. Возможно что-то интересное можно найти тут
http://www.xenomai.org/index.php/Main_Page или тут
http://rt.wiki.kernel.org/index.php/Main_Page
правда я не знаю как они дружат с ядрами без mmu. Вообще поддерживаю Павла - так же наверно поступил бы - критичный код вынести в ядро и пользоваться свободными аппаратными таймерами с прерываниями.
Спуститься к концу Подняться к началу
Персональная информация
leh (Guest)
Добавлено 06.06.2009 18:10 Сообщение: 4
leh (Guest)

Миллисекундный таймер на уровне ядра (с использованием прерывания от одного из таймеров) четко работать не будет. Я занимался портированием драйвера аналоговой телефонии DAHDI на платформу SAM9260 с полноценным Linux. В оригинале как раз использовались интервалы в 1 мс для переключения буферов DMA для захвата и воспроизведения звука, но на SAM9260 с таким интервалом наблюдалось переполнение буферов. Оказалось, что даже вызов функции printk() блокирует прерывания на время больше 1 мс.
Пришлось увеличить этот интервал до 10 мс.
Спуститься к концу Подняться к началу
sasa
Добавлено 06.06.2009 19:14 Сообщение: 5
sasa
5

Регистрация: 20.05.2009
Цитата
Оказалось, что даже вызов функции printk() блокирует прерывания на время больше 1 мс

А вы уверены что этот вызов вообще может что-то блокировать ? Насколько я знаю printk можно вызывать из любого контекста, даже в обработчике прерывания и она просто пишет сообщения в кольцевой буфер. Вы случайно не на консоль которая на dbgu выводили сообщения ? а то у нее наивысший приоритет судя по этому:
/*
* The default interrupt priority levels (0 = lowest, 7 = highest).
*/
static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = {
7, /* Advanced Interrupt Controller */
>>> 7, /* System Peripherals */ <<<
Спуститься к концу Подняться к началу
Персональная информация
sasa
Добавлено 06.06.2009 23:55 Сообщение: 6
sasa
5

Регистрация: 20.05.2009
Похоже я не прав - посмотрел kernel/printk.c - там много участков кода где отключаются прерывания. То что printk може вызываться в любом контексте - там просто восстанавливается прежнее состояние системы перед возвратом.
Спуститься к концу Подняться к началу
Персональная информация
Guest (Guest)
Добавлено 07.06.2009 08:32 Сообщение: 7
Guest (Guest)

Цитата
Вы случайно не на консоль которая на dbgu выводили сообщения ? а то у нее наивысший приоритет

Действительно, сообщения выводились printk() с таким уровнем, что они попадали на консоль. Вы правы, проблема видимо в этом и есть: при выводе на консоль printk(), предварительно заблокировав все прерывания, вызывает драйвер консоли, а тот, в свою очередь, посылает их в последовательный порт DBGU. Драйвер последовательного порта в идеале должен бы работать через ПДП, чтобы не задерживать вызов printk, но похоже там все пишется посимвольно с поллингом флага - отсюда и задержка.
Спуститься к концу Подняться к началу
Guest (Guest)
Добавлено 07.06.2009 08:35 Сообщение: 8
Guest (Guest)

Цитата
Вы случайно не на консоль которая на dbgu выводили сообщения ? а то у нее наивысший приоритет

Действительно, сообщения выводились printk() с таким уровнем, что они попадали на консоль. Вы правы, проблема видимо в этом и есть: при выводе на консоль printk(), предварительно заблокировав все прерывания, вызывает драйвер консоли, а тот, в свою очередь, посылает их в последовательный порт DBGU. Драйвер последовательного порта в идеале должен бы работать через ПДП, чтобы не задерживать вызов printk, но похоже там все пишется посимвольно с поллингом флага - отсюда и задержка.
Спуститься к концу Подняться к началу
leh (Guest)
Добавлено 07.06.2009 08:37 Сообщение: 9
leh (Guest)

Действительно, сообщения выводились printk() с таким уровнем, что они попадали на консоль. Вы правы, проблема видимо в этом и есть: при выводе на консоль printk(), предварительно заблокировав все прерывания, вызывает драйвер консоли, а тот, в свою очередь, посылает их в последовательный порт DBGU. Драйвер последовательного порта в идеале должен бы работать через ПДП, чтобы не задерживать вызов printk, но похоже там все пишется посимвольно с поллингом флага - отсюда и задержка.
Спуститься к концу Подняться к началу
leh (Guest)
Добавлено 07.06.2009 08:41 Сообщение: 10
leh (Guest)

Форум приглючил! Прошу модератора удалить лишние сообщения
Спуститься к концу Подняться к началу
Форум » starterkit.ru » Embedded Linux