Как создать прямоугольную волну с помощью ядра Linux - PullRequest
0 голосов
/ 01 февраля 2012

Мне нужно разработать драйвер Linux, который генерирует прямоугольную волну с циклом около 1 мс, используя платформу MIPS (это не i386).

Я пробовал некоторые методы, но они не увенчались успехом:

  • Использовать таймер / час ->, но цикл равен 12 мс и работает нестабильно
  • Невозможно использовать дополнительные пакеты в реальном времени в качестве RTLinux / RTAI, поскольку они не поддерживают MIPS
  • Использование потока ядра с бесконечным циклом и функцией udelay -> Это занимает слишком много ресурсов процессора -> Производительность не приемлема

Вы мне помогаете? Или ты мне мешаешь ...? (Пожалуйста, помогите!)

Спасибо.

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

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

1 голос
/ 18 августа 2013

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

Я добавлю это: если у него есть подсистема Output Compare или PWM (я не знаком с MIPS, но это не редкость во встроенных устройствах), вы можете просто написать несколько регистров, чтобы установить все это вверх, и тогда вам не нужно больше процессорного времени.

0 голосов
/ 01 февраля 2012

Это может быть возможно, но чтобы получить это из Linux, аппаратное обеспечение должно иметь определенные характеристики:

  1. вам нужно программируемое устройство таймера, которое может создавать прерывания с достаточно высоким приоритетом, чтобы другие действия ядра Linux (такие как планирование или другие прерывания, даже) не выгружали / блокировали обработчик прерываний и с достаточной гранулярностью / частота, соответствующая ограничениям стабильности вашего сигнала
  2. электрическая линия "прямоугольная волна" также должна быть программируемой, и операция (запись в регистр? Отображение в память записи в регистр? Специальная инструкция ЦП? ...?), Которая переключает свое состояние, должна быть гарантирована быстрее, чем кратчайшее время цикла, используемое с таймер выше (или вы можете получить "частоту муара")

Если это так, то ваш специальный драйвер таймера может переключать линию из своего обработчика прерываний высокого первичного уровня и создавать прямоугольную волну. Поскольку он и управляется прерываниями, и отделен от обычных источников / потребителей прерываний таймера (т. Е. Не используется совместно - нет задержки от возможной отправки нескольких событий таймера на прерывание), у вас гораздо больше шансов на достаточную точность.

Поскольку все это (наличие отдельно программируемого таймерного устройства, для начала) зависит от аппаратного обеспечения, вам нужно начать со спецификаций вашего CPU / SoC / платы и выяснить, доступно ли несколько независимых таймеров. .

...