Чтение состояния порта (Как правильно отмерять очень маленькие временные промежутки)

Модератор: Модераторы разделов

Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

http://www.klinux.org/en/download.html - это подойдет?
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Чтение состояния порта

Сообщение Zeus »

Там написано: It does not include real time extensions
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: Чтение состояния порта

Сообщение Slimy »

ИМХО лучше контроллера ничего для таких задач нет.
Конечно на кнопки давить проще на первый взгляд, но четкость страдает сильно да и ресурсы какие нужны.
Контроллер не шумит работать может то батарейки размером не больше коробка. ( кстати на тему потребление гдето статью видел как на PIC12c508 сделали http сервер причем питание было от пары электродов воткнутых в огурец :) ).
Не знаю как на AVR семейство но на PIC есть компиляторы под ASM (кстати он очень простой всего 35 команд ),С, Turbo Paskal и Basic /Ye я лично пользовался только ASM. И фирма microchip выслылала раньше контроллеры на халяву ( я заказывал и мне два раза приходило) , может счес уже этого и нет. В общем в нете есть море документации на это семество (причем на русском) , схем и т.д. Паяльником там и правда работы не много. Так что зря отказываетесь. Решение стоящее внимания.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

Где прочитать про общие принципы создания устройств на микроконтроллерах типа ATmega8 (Atmel)?
Спасибо сказали:
line
Сообщения: 3

Re: Чтение состояния порта

Сообщение line »

Если можно (ну очень надо) вопрос к sageLin:
как дела с прграммой ? И попутно -- на чем крутилась (ось и железо) и была ли повторяемость при статическом коде на порту ?
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

line писал(а): ↑
02.03.2006 19:51
как дела с прграммой ? И попутно -- на чем крутилась (ось и железо) и была ли повторяемость при статическом коде на порту ?

пробовал на slax 5.0.6 и gentoo 2005.1
да, повторяемость была
Спасибо сказали:
line
Сообщения: 3

Re: Чтение состояния порта

Сообщение line »

To sageLin:
Вот обнаружил любопытную статейку. Может быть поможет решить задачку в лоб. Хотелось бы знать результат. Просто есть задачка :rolleyes: : опрашивать тупое железо для SNMP системы, а она у меня из разряда: "...ну и попутно, между делом"
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

line:
Мне нужен полноценный компьютер, а не комп из которого многое вырезали... имхо либо RT ОСь надо ставить либо послушать советы и сделать устройство на микроконтроллере.
Спасибо сказали:
line
Сообщения: 3

Re: Чтение состояния порта

Сообщение line »

Всем привет !
Может быть я что-то не внимательно прочитал, но IMHO в статье не говорится о "доводки" системы, до состояния RT методом кастрации. И вообще *nix позиционируется, как (ну если вспомнить историю ее появления) система передачи-обработки (частный случай - маршрутизация) данных. Да, живя в Москве (ну или на границе с Китаем:) МК - наиболее простой на первый взгляд выход, но позвольте причем здесь Linux? Ведь программу обработки данных, полученных с RS, напишет школьник в "визуал васике" под мастдайкой.
Что касается конкретной задачи, если конечно в описании она не была упрощена до примитива, может быть имеет смысл посмотреть стробируемый режим порта и соответственно драйвер некого устойства, типа считыватель с перфоленты (смех в зале).
P.S. Прошу не воспринимать мое письмо как вызов. Просто обидно за те времена когда компы были большими а проги маленькими, да и за Linux тоже, ведь из-за отсутствия док. самый простой, к сожалению, способ нарисовать что-либо дельное - это поиск в сырцах, а ведь за командой разработчиков не угонишся.
Спасибо сказали:
astro
Сообщения: 2

Re: Чтение состояния порта

Сообщение astro »

> В зависимости от задачи компьютер должен отвечать на определнную последовательность двумя битами.
> Например, на 000 ответ 01, на 001 - 11, на 010 - 00 и т.д.

Всё зависит от задачи. Если только отвечать по такой простой логике, то это можно сделать на cpld.
Если надо иметь управление от компьютера, то тогда на любом контроллере.
Если надо иметь управление и сложную обработку только тогда смотреть на линукс (или другие ОС).
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

Объясняю на пальцах, что я хочу получить:

Вначале мне, например, нужна частота 102.00 MHz будем считать, что на запросы приемного устройства должны быть ответы:

000 - 01
001 - 10
010 - 10
011 - 00
100 - 10
101 - 11
110 - 01
111 - 00

Потом мне понадобилась частота 104.00 MHz для этого я с помощью компьютера заставляют отвечать микроконтоллер по другому, например так:

000 - 11
001 - 01
010 - 00
011 - 11
100 - 00
101 - 01
110 - 11
111 - 11

В электронике я ИМХО нормально разбираюсь, но я никогда не работал с микронтроллерами... поэтому прошу разжевывать все инфу о них ;)
Спасибо сказали:
Nab
Сообщения: 257

Re: Чтение состояния порта

Сообщение Nab »

sageLin писал(а): ↑
04.03.2006 21:16
Объясняю на пальцах, что я хочу получить:

Вначале мне, например, нужна частота 102.00 MHz будем считать, что на запросы приемного устройства должны быть ответы:

000 - 01
001 - 10
010 - 10
011 - 00
100 - 10
101 - 11
110 - 01
111 - 00

Потом мне понадобилась частота 104.00 MHz для этого я с помощью компьютера заставляют отвечать микроконтоллер по другому, например так:

000 - 11
001 - 01
010 - 00
011 - 11
100 - 00
101 - 01
110 - 11
111 - 11

В электронике я ИМХО нормально разбираюсь, но я никогда не работал с микронтроллерами... поэтому прошу разжевывать все инфу о них ;)

эт понятно, и не очень сложно...
берешь спецификацию на приглянувшийся микроконтроллер и изучаешь, потом разобравшись в контактах приблизительно опредеяешь на каком порту будет висеть девайс и вешать на него прерывание, по которому и будешь генерить свои единички...
Также написать обработчик прерывания UART и принимать команды с компа, в принципе эт тоже достаточно просто...
Но плясать нужно с одной стороны от возможностей и особенностей выбранного микроконтроллера, с другой стороны от алгоритма работы...
В твоем случае подойдет что-то из AVR Classic.
Но перед дачей советов ты действительно должен определиться на чем будешь делать.... потому как особенности есть везде...
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
astro
Сообщения: 2

Re: Чтение состояния порта

Сообщение astro »

Стабильные 6КГц из пользовательского приложения это нереально. Варианта два - или реализовать управление из драйвера или вынести его во внешний контроллер.

По первому варианту читайте
http://www.xml.com/ldd/chapter/book/
http://lwn.net/Kernel/LDD3/
http://www.linux.it/~rubini/docs/parallela/parallela.html

По второму atmel.ru
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

2astro: а что читать человеку который не разбирается в микронтроллерах? раньше вроде сайт был avr123.nm.ru...
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: Чтение состояния порта

Сообщение Slimy »

sageLin писал(а): ↑
20.03.2006 08:22
2astro: а что читать человеку который не разбирается в микронтроллерах? раньше вроде сайт был avr123.nm.ru...

Так контроллер тот же компьтер только меньше намного и возможности скромнее. Ничего в нем сложного нет. Всетаки советую подумать насчет PIC они проще атмелов (хоть и возможности меньше) а читать на microchip.ru или в гуголе на конретный контроллер искать pdf.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Чтение состояния порта

Сообщение flook »

Ребята, не горячитесь - точно короткие промежутки времени меряются select-ом. Даже с учетом вытеснения. На несильно нагруженной системе он поможет, на сильно - никто не спасет, даже RT...
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Чтение состояния порта

Сообщение Zeus »

flook писал(а): ↑
20.03.2006 11:50
точно короткие промежутки времени меряются select-ом. Даже с учетом вытеснения.

Значит ли это что:
Если заблокировать поток на select'е на, допустим, 1 мкс, то РОВНО через 1 мкс, независимо от того, какой код выполнялся на процессоре - он вытеснится и управление передастся заблокированному потоку после select'а?
Коли так, то причём тут сильно-несильно загруженные системы?

И второй вопрос: получив процессор сколько времени наш поток будет к нему подключен? Гарантированно 1 квант?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Чтение состояния порта

Сообщение flook »

Zeus писал(а): ↑
20.03.2006 18:52
flook писал(а): ↑
20.03.2006 11:50

точно короткие промежутки времени меряются select-ом. Даже с учетом вытеснения.

Значит ли это что:
Если заблокировать поток на select'е на, допустим, 1 мкс, то РОВНО через 1 мкс, независимо от того, какой код выполнялся на процессоре - он вытеснится и управление передастся заблокированному потоку после select'а?
Коли так, то причём тут сильно-несильно загруженные системы?

Если у Вас на машине помимо этого процесса бегает еще пару тыщ других, что пока они все свои кванты не отпахают - фиг, кто даст вам время, так как новый процесс попадет в активную очередь в конец - а она может быть длинной.
RT процессы обладают тем свойством, что после ухода с runqueue их не убирают в expired очередь (кто не знает как устроен новый планировщик - потом расскажу), а оставляют в активной по истечении его "кванта" чтоб он был более interactive. Ессно, что если у Вас на машине все процессы - real time, то ни о каких гарантиях и речи быть не может.

select гарантирует, что через указанное время процесс разбудят. Если очереди не сильно нагружены - то он практически тутже получит и процессор.

Zeus писал(а): ↑
20.03.2006 18:52
И второй вопрос: получив процессор сколько времени наш поток будет к нему подключен? Гарантированно 1 квант?

Конечно! В течение кванта принудитеьного вытеснения нет. Ессно, что если я буду в цикле звать yield(), то мой процесс и кванта не выживет - две инструкции жизни и мы опять в... ядре и переключаемся.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Чтение состояния порта

Сообщение Zeus »

flook писал(а): ↑
20.03.2006 19:05
select гарантирует, что через указанное время процесс разбудят. Если очереди не сильно нагружены - то он практически тутже получит и процессор.

Подозреваю, что "разбудят" здесь имеется ввиду не программистский термин, а системный - состояние потока?
Просто я привык, что поток "уснул" (заблокировался) - не потребляет процессорное время, "проснулся" (разблокировался) - начал выполнение.
Но раз так, то select не поможет гарантированно точно отмерять малые интервалы: select "будит" процесс, но когда он реально начнёт исполнять код - неизвестно.
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: Чтение состояния порта

Сообщение Slimy »

А может проще делитель на входе замутить :) если имеются заранее извесные шаги. Если с электроникой все ОК тогдаконтроллер понять раз плюнуть. Это чисто программистам сложнее т.к. они привыкли кнопки нажимать без задумок на тему какой физический процесс это вызывает. И боюсь что на частоты 100мгц и выше нужны не слабые контроллеры. Всеравно делители придется ставить как ни крути.Я тут подумал а может тогда проще микросхему аппаратного счетчика поставить? ИМХО самый лучши вариант а дальше уже все с помощь программы. И контроллер изучать не придется.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Чтение состояния порта

Сообщение Zeus »

Slimy писал(а): ↑
20.03.2006 23:11
А может проще делитель на входе замутить :) если имеются заранее извесные шаги. Если с электроникой все ОК тогдаконтроллер понять раз плюнуть. Это чисто программистам сложнее т.к. они привыкли кнопки нажимать без задумок на тему какой физический процесс это вызывает. И боюсь что на частоты 100мгц и выше нужны не слабые контроллеры. Всеравно делители придется ставить как ни крути.Я тут подумал а может тогда проще микросхему аппаратного счетчика поставить? ИМХО самый лучши вариант а дальше уже все с помощь программы. И контроллер изучать не придется.

Да давали ему уже один вариант: ПЛСы.
Но ставить программные эксперименты быстрее и дешевле, чем в электронике.
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

Охото бы проверить сам приемник... подскажите программу, которая может отобразить временную диаграмму состояния LPT порта.
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

Шо, нету таких прог?
Спасибо сказали:
Slimy
Сообщения: 1689
ОС: openSuSE 11.2 GM (GеMор едишн)

Re: Чтение состояния порта

Сообщение Slimy »

sageLin писал(а): ↑
15.05.2006 22:54
Шо, нету таких прог?

Есть для DOS видел. Я так понимаю чтото вроде логического анализатора, искать именно по этим признакам.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
Спасибо сказали:
Аватара пользователя
xorader
Сообщения: 1030
Статус: собирающий миры
ОС: Debian

Re: Чтение состояния порта

Сообщение xorader »

В цикле примерно это юзай:

Код: Выделить всё


time_t  current_time;   /* time of this pulse */
struct timeval last_time;
gettimeofday(&last_time, NULL);
current_time = (time_t) last_time.tv_sec;

(цикл начинаем) {
// полезный код
// ...

        /*
         * Synchronize to a clock.
         * Sleep(last_time + 1/PULSE_PER_SCD - now).
         * Careful here of signed versus unsigned arithmetic.
         */
         {
            struct timeval now_time;
            long secDelta;
            long usecDelta;

            gettimeofday(&now_time, NULL);
            usecDelta   = ((int) last_time.tv_usec) - ((int) now_time.tv_usec)
                        + 1000000 / PULSE_PER_SCD;
            secDelta    = ((int) last_time.tv_sec) - ((int) now_time.tv_sec);
            while (usecDelta < 0) {
                usecDelta += 1000000;
                secDelta  -= 1;
            }

            while (usecDelta >= 1000000) {
                usecDelta -= 1000000;
                secDelta  += 1;
            }

            if (secDelta > 0 || (secDelta == 0 && usecDelta > 0)) {
                struct timeval stall_time;

                stall_time.tv_usec = usecDelta;
                stall_time.tv_sec  = secDelta;
                if (select(0, NULL, NULL, NULL, &stall_time) < 0) {
                    printf("some_loop: select: stall: %s", strerror(errno));
                    exit(1);
                }
            }

gettimeofday(&last_time, NULL);
current_time = (time_t) last_time.tv_sec;
}


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

P.S. ну и man 2 select
Molchanov Alexander (aka Xor)
*offtopic* - ololo!
Спасибо сказали:
f0ma
Сообщения: 10

Re: Чтение состояния порта

Сообщение f0ma »

ИМХО Либо драйвер либо циклический буфер на чем нибудь типа mega8. Использовать для такой простой задачи RTL ось не имеет смысла. Порт LPT без встроенного буфера (а он там есть, но нужно его запрограммировать и тогда до 2мб/с) 700 кГц прокачивает стабильно. Если речь идет только о вводе. На базе контроллера необходимо сделать циклический буфер в который синхронно будут писаться данные и асинхронно читаться. в mega8 - 1Кб рамы то-есть проблем с переполнением быть не должно. Для упрощения программирования задается НЕЗНАЧЕНИЕ соответствующее уходу буфера в минус и НЕЗНАЧЕНИЕ2 говорящее о переполнении. Также возможна запись времени между изменениями сигнала. С IO ситуация заметно сложнее. Возможно проще логику полностью убрать в контроллер, а компьютеру отсылать уже результат обработки (тк прогу для контроллера можно написать на С...), если нет, то тут навреное проще и правда PCI планку купить.
/ Mandriva 2005 / KDE 3.3.2 /
Спасибо сказали:
Аватара пользователя
sageLin
Сообщения: 46

Re: Чтение состояния порта

Сообщение sageLin »

Мне нужно ХОТЯБЫ проверить работу устройства. Для проверки думаю поставить Sand Linux discovery v 1.1 (RTOS) и подключить РПУ к LPT порту. Но каким софтом воспользоваться, дабы получить временную характеристику порта?
PS: Свою программу не хочу использовать, чтобы исключить возможность ошибки в исходном коде программы.
Спасибо сказали: