|
Генератор меандра на ARM., Генерация сигнала управляемой частоты ARM-процессоре под Linux |
|
|
|
Feb 8 2012, 13:57
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-11-11
Из: Минск
Пользователь №: 68 530

|
Здравствуйте, господа. После долгих гуглений и размышлений решил обратиться сюда. Собственно, есть такая штука с установленным Linux (Digi Embedded Linux). Я на ней диплом сейчас пишу. Но пока задача не связанная с дипломом. Нужно на светодиод на плате подать сигнал заданной частоты (100 Гц - 100 kГц). Управляться это должно через Ethernet. Как я себе это представляю: Программа на компьютере, которая формирует управляющий сигнал и передает его на плату. С этим понятно. Но вот дальше, есть много вопросов: 1) Как заставить программу записывать нули единицы в файл драйвера с нужной скоростью? Понял что всякие usleep и nanosleep не подходят, так как квант времени системы гораздо больше необходимой задержки (или я ошибаюсь?). 2) Если каким то образом заставить систему выполнять только процесс записи в файл драйвера, то загрузка CPU будет 100%. Как тогда можно слушать команду пришедшую от управляющей программы? В общем, как так. Буду благодарен за любые советы по этой проблеме.
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Feb 8 2012, 20:57
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-11-11
Из: Минск
Пользователь №: 68 530

|
cpl, я тоже уже начал склоняться к написанию драйвера для gpio. Но так как драйверы не разу не писал, ни под Linux, ни под Windows, хочется как-то обойти пока это дело (хоть я понимаю что скорее всего не получится). Вот что нагуглил: Цитата Задержка через порты ввода/вывода
Другой способ обеспечить задержку в несколько микросекунд - это порты ввода/вывода. Запись или чтение любого значения из порта 0x80 (о том, как это сделать, см. выше) обеспечивает задержку почти точно равную одной микросекунде, независимо от типа и скорости вашего процессора. Чтобы обеспечить задержку в несколько микросекунд, вы можете выполнить эту операцию несколько раз. Запись в этот порт не оказывает никакого влияния на компьютер (и некоторые драйверы используют это). Таким образом, обычно выполняется задержка в {in|out}[bw]_p() (см. asm/io.h).
На самом деле, операции ввода/вывода на большинство портов в диапазоне от 0 до 0x3ff тоже дают задержку около одной микросекунды. Так что, если вы, например, производите запись в параллельный порт, для обеспечения задержки, просто добавьте дополнительные inb() из порта. Вопрос такой, сколько процессорного времени занимает считать функцией read() 1 байт из файла драйвера gpio? И возможно ли с помощью этого управлять временем? Тогда можно было бы запускать цикл с нужным числом вызовов этой функции. aaarrr, если под аппаратное реализацией вы имеете ввиду, припаивание еще какого-то внешнего девайса, то это категорически не подходит.
|
|
|
|
|
Feb 8 2012, 21:21
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-11-11
Из: Минск
Пользователь №: 68 530

|
Цитата(aaarrr @ Feb 9 2012, 00:00)  Не припаивание внешнего, а использование внутреннего. Это и есть написание драйвера, или я чего-то не до понимаю? Простите мне мою неосведомленность. Студент
|
|
|
|
|
Feb 14 2012, 07:20
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-11-11
Из: Минск
Пользователь №: 68 530

|
Спасибо aaarrr и cpl за советы. Пытался разобраться во внутреннем устройстве процессора. Так вот, оказывается в нем есть 4 таймера с функциями PWM. Я даже понял как ими управлять, но как мне связать выход таймера и выход к которому припаяна лампочка так, чтоб не них был один и тот же сигнал? Прикрепил четыре файла: в timer.jpg схема таймера, в Pin.jpg номера пинов к которым подключены выходы таймеров, в Pin_Set.jpg возможные настройки этих портов и в GPBDAT.jpg описание которое меня смущает. Помогите пожалуйста разобраться.
Эскизы прикрепленных изображений
|
|
|
|
|
Feb 14 2012, 14:18
|
Группа: Новичок
Сообщений: 5
Регистрация: 26-11-11
Из: Минск
Пользователь №: 68 530

|
По поводу режима работы, пин светодиода (GPL10) нужно устанавливать в режим output, как я понимаю, а вот вывод таймера скорее всего в TOUT. Так вот вопрос, возможно ли без пайки их соединить так, чтоб сигнал который появляется на GPB2(таймер 2) например, появлялся и на GPL10 (мой светодиод)?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|