roma_bl9 0 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба Здравствуйте, господа. После долгих гуглений и размышлений решил обратиться сюда. Собственно, есть такая штука с установленным Linux (Digi Embedded Linux). Я на ней диплом сейчас пишу. Но пока задача не связанная с дипломом. Нужно на светодиод на плате подать сигнал заданной частоты (100 Гц - 100 kГц). Управляться это должно через Ethernet. Как я себе это представляю: Программа на компьютере, которая формирует управляющий сигнал и передает его на плату. С этим понятно. Но вот дальше, есть много вопросов: 1) Как заставить программу записывать нули единицы в файл драйвера с нужной скоростью? Понял что всякие usleep и nanosleep не подходят, так как квант времени системы гораздо больше необходимой задержки (или я ошибаюсь?). 2) Если каким то образом заставить систему выполнять только процесс записи в файл драйвера, то загрузка CPU будет 100%. Как тогда можно слушать команду пришедшую от управляющей программы? В общем, как так. Буду благодарен за любые советы по этой проблеме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба Как вариант написать свой драйвер для мигания светодиодом, драйверу передается значение с какой частотой мигать. от управляющей программы требуется передавать только изменившиеся значение частоты мигания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба Нужно на светодиод на плате подать сигнал заданной частоты (100 Гц - 100 kГц). Если 100кГц, то о программном формировании забудьте навсегда. Только аппаратный таймер/ШИМ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roma_bl9 0 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба cpl, я тоже уже начал склоняться к написанию драйвера для gpio. Но так как драйверы не разу не писал, ни под Linux, ни под Windows, хочется как-то обойти пока это дело (хоть я понимаю что скорее всего не получится). Вот что нагуглил: Задержка через порты ввода/вывода Другой способ обеспечить задержку в несколько микросекунд - это порты ввода/вывода. Запись или чтение любого значения из порта 0x80 (о том, как это сделать, см. выше) обеспечивает задержку почти точно равную одной микросекунде, независимо от типа и скорости вашего процессора. Чтобы обеспечить задержку в несколько микросекунд, вы можете выполнить эту операцию несколько раз. Запись в этот порт не оказывает никакого влияния на компьютер (и некоторые драйверы используют это). Таким образом, обычно выполняется задержка в {in|out}[bw]_p() (см. asm/io.h). На самом деле, операции ввода/вывода на большинство портов в диапазоне от 0 до 0x3ff тоже дают задержку около одной микросекунды. Так что, если вы, например, производите запись в параллельный порт, для обеспечения задержки, просто добавьте дополнительные inb() из порта. Вопрос такой, сколько процессорного времени занимает считать функцией read() 1 байт из файла драйвера gpio? И возможно ли с помощью этого управлять временем? Тогда можно было бы запускать цикл с нужным числом вызовов этой функции. aaarrr, если под аппаратное реализацией вы имеете ввиду, припаивание еще какого-то внешнего девайса, то это категорически не подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба aaarrr, если под аппаратное реализацией вы имеете ввиду, припаивание еще какого-то внешнего девайса, то это категорически не подходит. Не припаивание внешнего, а использование внутреннего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roma_bl9 0 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба Не припаивание внешнего, а использование внутреннего. Это и есть написание драйвера, или я чего-то не до понимаю? Простите мне мою неосведомленность. Студент :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 8 февраля, 2012 Опубликовано 8 февраля, 2012 · Жалоба Это и есть написание драйвера, или я чего-то не до понимаю? Простите мне мою неосведомленность. Студент :) Процессор внутри себя содержит периферию, пригодную для формирования меандра (PWM). Вот её и нужно задействовать. Если драйвера PWM нет, то таки да, его придется написать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roma_bl9 0 14 февраля, 2012 Опубликовано 14 февраля, 2012 · Жалоба Спасибо aaarrr и cpl за советы. Пытался разобраться во внутреннем устройстве процессора. Так вот, оказывается в нем есть 4 таймера с функциями PWM. Я даже понял как ими управлять, но как мне связать выход таймера и выход к которому припаяна лампочка так, чтоб не них был один и тот же сигнал? Прикрепил четыре файла: в timer.jpg схема таймера, в Pin.jpg номера пинов к которым подключены выходы таймеров, в Pin_Set.jpg возможные настройки этих портов и в GPBDAT.jpg описание которое меня смущает. Помогите пожалуйста разобраться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cpl 0 14 февраля, 2012 Опубликовано 14 февраля, 2012 · Жалоба В инициализации пинов задавайте режим работы, просто пин ввод-вывод, или альтернативная функция выход таймера например. PS Не перегрузите вывод процессора прямым подключением светодиода, а то сгорит. Подключать лучше через буфер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
roma_bl9 0 14 февраля, 2012 Опубликовано 14 февраля, 2012 · Жалоба По поводу режима работы, пин светодиода (GPL10) нужно устанавливать в режим output, как я понимаю, а вот вывод таймера скорее всего в TOUT. Так вот вопрос, возможно ли без пайки их соединить так, чтоб сигнал который появляется на GPB2(таймер 2) например, появлялся и на GPL10 (мой светодиод)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться