Формирование сигнала на порту GPIO (разработка в С++
-
Здравствуйте! Задача стоит в том: необходимо формировать импульсы с периодом в 100мкс. Реализованние это как бесконечный цикл (пишу на С/С++) но если смотреть на осциллографе периодически фронты импульса двигуются (просиходит задержка, связанная видимо с внутренними прерываниями )
Не подскажете как можно избавится от этих задержек? -
Для формирования импульсов используйте прерывания по таймеру, а не бесконечный программный цикл.
-
man2000 (2014-11-12 15:29:26):Для формирования импульсов используйте прерывания по таймеру, а не бесконечный программный цикл.
для этого необходимо писать драйвер? -
Нет, драйвер не нужен. Используйте библиотеку BCM2835, но модуль лучше выполнять в режиме ядра — так генерация будет точнее.
-
man2000 (2014-11-20 00:44:54):Нет, драйвер не нужен. Используйте библиотеку BCM2835, но модуль лучше выполнять в режиме ядра — так генерация будет точнее.
А можно по подробнее. Я не понял, как можно использовать прерывания с помощью этой библиотеке. пришлось для формирования сигнала привязывать по UART микроконтроллер, который уже и формирует сигнал. Если бы можно эту же задачу сделать без него(МК), это сильно упростило бы схему. -
Функция bcm2835_delayMicroseconds() как раз использует прерывание по таймеру и предназначена для точной выдержки интервала времени. Просто вызывайте эту функцию в Вашем цикле, который формирует импульсы. Должно работать. ИМХО.
-
man2000 (2014-11-27 21:47:45):Функция bcm2835_delayMicroseconds() как раз использует прерывание по таймеру и предназначена для точной выдержки интервала времени. Просто вызывайте эту функцию в Вашем цикле, который формирует импульсы. Должно работать. ИМХО.
так изначально и делал, я так понимаю системные прерывания «мешают» формировать нормальный сигнал -
Если при использовании bcm2835_delayMicroseconds() фронты импульсов сдвигаются на недопустимую величину (кстати, какая величина для Ваших целей допустима, и какой сдвиг получается на практике ?), то дело плохо… Предположу, что наряду с формированием импульсов Малинка нагружена ещё какими-то ресурсоёмкими задачами.
Постарайтесь максимально оптимизировать фрагмент программы, формирующий очередной импульс. Например, категорически нельзя использовать в этом месте файловые операции и обращения к другим устройствам. Исключите из программы все функции, которые можно выполнить в других, параллельно исполняемых программах.
Если не поможет, то можно попробовать запускать формирователь импульсов как «демона», ну и как последнее средство — запуск в режиме ядра. -
man2000 (2014-11-28 19:20:11):Если при использовании bcm2835_delayMicroseconds() фронты импульсов сдвигаются на недопустимую величину (кстати, какая величина для Ваших целей допустима, и какой сдвиг получается на практике ?), то дело плохо… Предположу, что наряду с формированием импульсов Малинка нагружена ещё какими-то ресурсоёмкими задачами.
Постарайтесь максимально оптимизировать фрагмент программы, формирующий очередной импульс. Например, категорически нельзя использовать в этом месте файловые операции и обращения к другим устройствам. Исключите из программы все функции, которые можно выполнить в других, параллельно исполняемых программах.
Если не поможет, то можно попробовать запускать формирователь импульсов как «демона», ну и как последнее средство — запуск в режиме ядра.
Запускал программу состоящую из единственного цикла с постоянным изменением сигнала (демоном тоже). больше ничего не было запущенно. Осциллографом видно, периодически проскакивают задержки большей длины чем положено. (длина импульса ~100мкс, приемлимое отклонение 1-3%)
Я так понимаю что единственный выход писать драйвер, буду в свободное время просвещаться.