Как генерировать тактовый сигнал ~ 100 кГц в модуле ядра Liunx с помощью битовой синхронизации? - PullRequest
0 голосов
/ 08 января 2011

Я пытаюсь сгенерировать тактовый сигнал на выводе GPIO (платформа ARM, mach-davinci, ядро ​​2.6.27), который будет иметь частоту около 100 кГц.Использование тасклета с высоким приоритетом для этого.Теория проста, установите gpio высокий, udelay для 5us, установите gpio low, подождите еще 5us, но появляются странные проблемы.Прежде всего, я не могу получить эти 5USD, но это нормально, похоже на проблему с производительностью, поэтому я перешел на период = 40US (дает ~ 25 кГц).Вторая проблема хуже всего.Один раз в ~ 10 мс udelay ждет в 3 раза дольше, чем обычно.Я думаю, что это занимает много времени, но это недопустимо с точки зрения протокола (который будет реализован поверх этого).Есть ли способ временно отключить сердцебиение, скажем, на 500 мс?Или, может быть, я делаю это неправильно с самого начала?Есть комментарии?

Ответы [ 3 ]

2 голосов
/ 08 января 2011

Вы не можете использовать тасклет для такой работы. Тасклеты могут быть прерваны прерываниями. В некоторых случаях ваш тасклет может быть даже выполнен в контексте процесса!

Если вам абсолютно необходимо сделать это таким образом, используйте обработчик прерываний - входите, отключайте прерывания, делайте все, что вам нужно, и выходите как можно быстрее.

2 голосов
/ 12 января 2011

Генерация часов асинхронно в программном обеспечении не является правильным решением. Я могу придумать две альтернативы, которые будут работать лучше:

  1. Ваш процессор может иметь встроенное периферийное устройство тактового генератора, которое еще не используется ядром или другим драйвером. Когда вы устанавливаете один из них, вы говорите ему, как быстро работают его часы, и он просто начинает выдавать импульсы.

    Получите техническое описание вашего процессора и изучите его.

    Возможно, вы не найдете периферийное устройство, называемое «часами» само по себе , но можете найти нечто подобное, которое вы можете задействовать, например периферийное устройство ШИМ.

  2. Для другого устройства, с которым вы разговариваете, на самом деле могут не потребоваться обычные часы. Некоторым микросхемам, которым нужна линия «тактовых импульсов», просто нужна линия, которая становится высокой, когда есть бит для чтения, которая затем становится низкой, пока меняются строки данных. Если это так, то то, что вы читаете с частотой 100 кГц, не является жестким требованием к тактовым частотам именно этой частоты, это всего лишь верхний предел скорости линии тактовых импульсов (и, следовательно, линии (ий) данных). разрешено переходить.

    С процессором, который намного быстрее, чем часы, вы хотите разделить его на две половины:

    • «Верхняя половина» корректно устанавливает состояние строки данных, а затем поднимает тактовую линию. Затем он планирует запуск нижней половины через 5 мкс, используя прерывание или таймер ядра.

    • В «нижней половине», вызываемой прерыванием или таймером, верните линию часов вниз, а затем запланируйте, чтобы верхняя половина снова запустилась через 5 мкс.

0 голосов
/ 08 января 2011

Если вы не можете запустить тасклет таймера с более высоким приоритетом, чем таймер ядра, вы всегда будете подвержены этому типу дрожания. Тебе действительно нужно делать это с помощью битов? Было бы гораздо проще использовать аппаратный таймер или генератор ШИМ. Сконфигурируйте таймер для работы с желаемой скоростью, установите вывод на вывод, и все готово.

Если вам нужен программный контроль в каждом битовом периоде, вы можете попытаться обойти другие задачи, настроив выполнение своего тасклета на короткий промежуток времени, скажем, три четверти от вашей 40-часовой задержки. В тасклете отключите прерывания и опрашивайте часы, пока не доберетесь до правильного временного интервала в 40 uss, установите состояние ввода / вывода, повторно включите прерывания и выйдите. Но это эффективно набирает 25% вашей системы при просмотре часов.

...