Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91 и драйвер таймера
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
Dubov
Что нужно включить в файл board-xxx.c для того чтобы появился драйвер таймера в системе. Здаётся мне что толкьо вызова at91_add_device_tc() недостаточно.
Хочу получить драйвер, посредствам которого можно через пользовательский интерфейс управлять частотой генерации на ноге.
xor.kruger
Для того чтобы просто подергать ногой с заданной частотой достаточно в драйвер добавить такие строки:

Код
...
#define TCM_CLK        AT91_PIN_PC1
#define TCM8210_CLK    8000000
...
pck0 = clk_get(NULL, "pck0");
plla = clk_get(NULL, "plla");
at91_set_B_periph(TCM_CLK, 0);    /* PCK0 */
clk_set_parent(pck0, plla);
clk_set_rate(pck0, TCM8210_CLK);
clk_enable(pck0);
...

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

Dubov
Цитата(xor.kruger @ Jun 18 2012, 14:56) *
Для того чтобы просто подергать ногой с заданной частотой достаточно в драйвер добавить такие строки:

Код
...
#define TCM_CLK        AT91_PIN_PC1
#define TCM8210_CLK    8000000
...
pck0 = clk_get(NULL, "pck0");
plla = clk_get(NULL, "plla");
at91_set_B_periph(TCM_CLK, 0);    /* PCK0 */
clk_set_parent(pck0, plla);
clk_set_rate(pck0, TCM8210_CLK);
clk_enable(pck0);
...

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

но я думаю что pck для моих целей не подходит. Например мне нужен сигнал 100000кГц. Подобрать делитель для pck тогда неполучится. Интереса для: хочется увидеть как создать драйвер, который из пользовательского пространства принимает целое число и дёргает нагой с этой частотой.
xor.kruger
Цитата
Интереса для: хочется увидеть как создать драйвер, который из пользовательского пространства принимает целое число и дёргает нагой с этой частотой.


Кратко в двух словах данный процесс не опишешь, поэтому советую заглянуть в небольшой туториал под названием "Writing device drivers in Linux: A brief tutorial". Так как раз описан с примером данный процесс работы с пользовательского пространства.
Enthusiast
Предлагаю обойтись без разработки драйверов, воспользовавшись стандартными возможностями "Линукса". Исходный код я приводил здесь.
Dubov
Цитата(Enthusiast @ Jun 19 2012, 15:45) *
Предлагаю обойтись без разработки драйверов, воспользовавшись стандартными возможностями "Линукса". Исходный код я приводил здесь.

Таймерное программное прерывание не подходит потому что джиттер выходного сигнала будет сильно зависеть от загруженности процессора и, например при обновлении экрана(при выводе списка задач посредствам утилиты top) выходной сигнал может вообще пропадать на короткое время.
Enthusiast
Цитата(Dubov @ Jun 20 2012, 11:52) *
Таймерное программное прерывание не подходит потому что джиттер выходного сигнала будет сильно зависеть от загруженности процессора и, например при обновлении экрана(при выводе списка задач посредствам утилиты top) выходной сигнал может вообще пропадать на короткое время.

В моём случае уход времени интервального таймера был в пределах 25 мкс (+/- 12,5 мкс) при стопроцентной загрузке процессора и "бомбардировании" платы сетевыми пакетами.
В любом случае, что мешает выставить приоритет реального времени для своей задачи? На свежих ядрах такое вполне возможно.
Dubov
Цитата(Enthusiast @ Jun 20 2012, 11:14) *
В моём случае уход времени интервального таймера был в пределах 25 мкс (+/- 12,5 мкс) при стопроцентной загрузке процессора и "бомбардировании" платы сетевыми пакетами.
В любом случае, что мешает выставить приоритет реального времени для своей задачи? На свежих ядрах такое вполне возможно.

Нашёл занятную таблицу для расчёта джиттера тактирующего сигнала для АЦП:
http://ru.wikipedia.org/wiki/%D0%90%D0%BD%....D0.B5.D1.80.29

Выходит, что при разрядности АЦП 16 бит и частоте тактирования 100кГц, получаем, что джиттер тактового сигнала не должен превышать примерно 50 пс.

Теперь привожу статью о "реальном времени" в Linux для AT91:
http://www.at91.com/linux4sam/bin/view/Linux4SAM/RealTime ,
вывод которой гласит что максимальный джиттер даже в режиме RT примерно 177 мкс.

Тогда возникаетв вопрос:
можно ли вообще из-под Linux тактировать АЦП? или 50пс - это полный бред для джиттера? Тогда какой джиттер достаточен?
Enthusiast
Цитата(Dubov @ Jun 24 2012, 22:28) *
Тогда возникаетв вопрос:
можно ли вообще из-под Linux тактировать АЦП? или 50пс - это полный бред для джиттера? Тогда какой джиттер достаточен?

Тактировать АЦП из под "Линукса" - бред.
На мой взгляд, "Линукс" хорош на задачах с периодом обсчета от 1 мс и более с уходом времени обработки на мс. Если требования жестче, чем 1 мс, то лучше делать без ОС.
Берите качественный тактовый генератор и будет Вам счастье.
Dubov
Цитата(Enthusiast @ Jun 25 2012, 16:54) *
Тактировать АЦП из под "Линукса" - бред.
На мой взгляд, "Линукс" хорош на задачах с периодом обсчета от 1 мс и более с уходом времени обработки на мс. Если требования жестче, чем 1 мс, то лучше делать без ОС.

бред не бред, но именно так предлагают реализовать генератор программисты AD))
понятно что бред, я имею ввиду: спутиться "на самое дно" Linux и написать драйвер таймера, чтобы тактировать АЦП. Вот только вопрос: поджойдёт ли для этого таймер AT91?

Цитата(Enthusiast @ Jun 25 2012, 16:54) *
Берите качественный тактовый генератор и будет Вам счастье.


имеете ввиду в виде отдельной микросхемы типа Epson? Никогда не встречал такого решения применительно к АЦП.
Enthusiast
Цитата(Dubov @ Jun 25 2012, 20:33) *
бред не бред, но именно так предлагают реализовать генератор программисты AD))
понятно что бред, я имею ввиду: спутиться "на самое дно" Linux и написать драйвер таймера, чтобы тактировать АЦП. Вот только вопрос: поджойдёт ли для этого таймер AT91?
имеете ввиду в виде отдельной микросхемы типа Epson? Никогда не встречал такого решения применительно к АЦП.

Я лишь хочу сказать, что для сигнала с периодом в 10 мкс лучше обойтись без ОС. От качества задающего тактового генератора будет зависеть точность работы АЦП. На мой взгляд, наглядным примером того до чего может довести верховенство программистов над схемотехниками могут служить осциллографы "Лекрой": никому не нужных настроек в избытке, а скорость переключения режимов работы сходна черепашьей. Решать, естественно, Вам. Успехов!
Dubov
Похоже тема плавно перетекает в тему "Отчего тактировать АЦП?"
Я просто видел в примерах что, например внутренний АЦП на AT91 тактировался таймером. Неужели слишком большой джиттер получится?
По поводу ОС: если написать тактирование на уровне ядра, то это всё равно что без ОС.

Цитата(Enthusiast @ Jun 26 2012, 16:50) *
Решать, естественно, Вам. Успехов!

Понятно, что мне. Но хочется же посоветоваться.
Dron_Gus
ИМХО, топикстартер хочет ипользовать аппаратный таймер с аппаратным же выходом. А все критикуют применение програмного.
Enthusiast
Всё верно: мы настраиваем и запускаем в работу аппаратный таймер микроконтроллера, однако срабатывания этого аппаратного таймера будут обрабатываться уже программными средствами операционной системы, превращая аппаратный таймер в программный с соотвествующим уходом времени обработки таймерного прерывания. Если не использовать операционную систему, то будет честный аппаратный таймер, спору нет.
Zelepuk
Цитата(Dron_Gus @ Jun 27 2012, 23:26) *
ИМХО, топикстартер хочет ипользовать аппаратный таймер с аппаратным же выходом. А все критикуют применение програмного.

совершенно верно. И меня интересует какой джиттер будет на этом таймере и можно ли им тактировать мой АЦП (16 бит 100кГц)

Цитата(Enthusiast @ Jun 28 2012, 07:02) *
Всё верно: мы настраиваем и запускаем в работу аппаратный таймер микроконтроллера, однако срабатывания этого аппаратного таймера будут обрабатываться уже программными средствами операционной системы, превращая аппаратный таймер в программный с соотвествующим уходом времени обработки таймерного прерывания. Если не использовать операционную систему, то будет честный аппаратный таймер, спору нет.

Но таймер начинает работать при инициализации ядра. По моему в таком случае это всё равно что работа таймера без ОС.
Dron_Gus
Цитата(Enthusiast @ Jun 28 2012, 08:02) *
Всё верно: мы настраиваем и запускаем в работу аппаратный таймер микроконтроллера, однако срабатывания этого аппаратного таймера будут обрабатываться уже программными средствами операционной системы, превращая аппаратный таймер в программный с соотвествующим уходом времени обработки таймерного прерывания. Если не использовать операционную систему, то будет честный аппаратный таймер, спору нет.

Не верно. Нам даже прерывания от этого таймера не нужны. Таймер по дотижению определенных хначений будет выставлять 0 или 1 на ножке. Участие ПО не требуетя. Почитайте описание таймеров семейства at91. Джиттер будет напрямую зависеть от кварца, плл и делителей. Но не от ПО и загруженности ситемы.

16 бит 100 КГц это хорошо, а какая частота мастер клока ему нужна? 16 * 100 * 1000?
Zelepuk
А ещё думаю можно написать драйвер для управления аппаратным клоком. Чтобы можно было динамически менять частоту.
Dron_Gus
Читайте раздел "34. Timer Counter".
Zelepuk
У нас тактировали АЦП с частотой 50кГц от Плис. незнаю насколько для этих целей подойдёт клок от таймера MCU
Enthusiast
Цитата(Dron_Gus @ Jun 28 2012, 10:58) *
Не верно. Нам даже прерывания от этого таймера не нужны. Таймер по дотижению определенных хначений будет выставлять 0 или 1 на ножке. Участие ПО не требуетя. Почитайте описание таймеров семейства at91. Джиттер будет напрямую зависеть от кварца, плл и делителей. Но не от ПО и загруженности ситемы.

Даже если мы и запустим внешнее АЦП точно по таймерной метке с микроконтроллера, то как Вы собираетесь обрабатывать эти самые данные с АЦП? Вот тут-то Вас ждет попаданец: программный обработчик операционной системы "уведет" всю точность аппаратного таймера. И таймерный драйвер ядра лишь уменьшит уход времени таймерного отсчета, но не решит вопроса в корне, так как драйвер тоже подчиняется программному распределению времени обработки внутри операционной системы. И осциллограф это только подтвердит.
Dron_Gus
Цитата(Enthusiast @ Jun 28 2012, 22:26) *
Даже если мы и запустим внешнее АЦП точно по таймерной метке с микроконтроллера, то как Вы собираетесь обрабатывать эти самые данные с АЦП? Вот тут-то Вас ждет попаданец: программный обработчик операционной системы "уведет" всю точность аппаратного таймера. И таймерный драйвер ядра лишь уменьшит уход времени таймерного отсчета, но не решит вопроса в корне, так как драйвер тоже подчиняется программному распределению времени обработки внутри операционной системы. И осциллограф это только подтвердит.

Надо будет только успевать забирать данные до следующего измерения, в этом джиттер не страшен. А сами выборки будут строго привязаны к генерируемому аппаратным таймером сигналу. К тому же топикстартер не упомянул, по какому интерфейсу АЦП подключен к контроллеру. Может это паралельная шина с FIFO, может I2S в режиме мастера, может SPI в режиме мастера. А может и slave-интерфейс, но в АЦП присутствует буфер. Методов много.
Dubov
Цитата(Dron_Gus @ Jun 28 2012, 23:32) *
Надо будет только успевать забирать данные до следующего измерения, в этом джиттер не страшен. А сами выборки будут строго привязаны к генерируемому аппаратным таймером сигналу. К тому же топикстартер не упомянул, по какому интерфейсу АЦП подключен к контроллеру. Может это паралельная шина с FIFO, может I2S в режиме мастера, может SPI в режиме мастера. А может и slave-интерфейс, но в АЦП присутствует буфер. Методов много.

Шина SPI. АЦП посылает прерывание на мастер и тот забирает данные. Драйвер АЦП складывает отсчёты в кольцевой буфер и выдаёт пользователю через соответствующий программный интерфейс.
Вот мне инетерсно: по ТЗ требуется вести расчёты каждую миллисекунду(каждые 100 отсчётов) и складывать результат в массив.
Получится ли такое на Linux?
специалист нашего отдела мне сказал что нужно просто буфер отсчётов сделать длиннее. Пока не понимаю как это связано.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.