Чтение состояния порта (Как правильно отмерять очень маленькие временные промежутки)
Модератор: Модераторы разделов
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
http://www.klinux.org/en/download.html - это подойдет?
-
Zeus
- Сообщения: 694
Re: Чтение состояния порта
Там написано: It does not include real time extensions
-
Slimy
- Сообщения: 1689
- ОС: openSuSE 11.2 GM (GеMор едишн)
Re: Чтение состояния порта
ИМХО лучше контроллера ничего для таких задач нет.
Конечно на кнопки давить проще на первый взгляд, но четкость страдает сильно да и ресурсы какие нужны.
Контроллер не шумит работать может то батарейки размером не больше коробка. ( кстати на тему потребление гдето статью видел как на PIC12c508 сделали http сервер причем питание было от пары электродов воткнутых в огурец
).
Не знаю как на AVR семейство но на PIC есть компиляторы под ASM (кстати он очень простой всего 35 команд ),С, Turbo Paskal и Basic /Ye я лично пользовался только ASM. И фирма microchip выслылала раньше контроллеры на халяву ( я заказывал и мне два раза приходило) , может счес уже этого и нет. В общем в нете есть море документации на это семество (причем на русском) , схем и т.д. Паяльником там и правда работы не много. Так что зря отказываетесь. Решение стоящее внимания.
Конечно на кнопки давить проще на первый взгляд, но четкость страдает сильно да и ресурсы какие нужны.
Контроллер не шумит работать может то батарейки размером не больше коробка. ( кстати на тему потребление гдето статью видел как на 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
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
Где прочитать про общие принципы создания устройств на микроконтроллерах типа ATmega8 (Atmel)?
-
line
- Сообщения: 3
Re: Чтение состояния порта
Если можно (ну очень надо) вопрос к sageLin:
как дела с прграммой ? И попутно -- на чем крутилась (ось и железо) и была ли повторяемость при статическом коде на порту ?
как дела с прграммой ? И попутно -- на чем крутилась (ось и железо) и была ли повторяемость при статическом коде на порту ?
-
sageLin
- Сообщения: 46
-
line
- Сообщения: 3
Re: Чтение состояния порта
To sageLin:
Вот обнаружил любопытную статейку. Может быть поможет решить задачку в лоб. Хотелось бы знать результат. Просто есть задачка
: опрашивать тупое железо для SNMP системы, а она у меня из разряда: "...ну и попутно, между делом"
Вот обнаружил любопытную статейку. Может быть поможет решить задачку в лоб. Хотелось бы знать результат. Просто есть задачка
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
line:
Мне нужен полноценный компьютер, а не комп из которого многое вырезали... имхо либо RT ОСь надо ставить либо послушать советы и сделать устройство на микроконтроллере.
Мне нужен полноценный компьютер, а не комп из которого многое вырезали... имхо либо RT ОСь надо ставить либо послушать советы и сделать устройство на микроконтроллере.
-
line
- Сообщения: 3
Re: Чтение состояния порта
Всем привет !
Может быть я что-то не внимательно прочитал, но IMHO в статье не говорится о "доводки" системы, до состояния RT методом кастрации. И вообще *nix позиционируется, как (ну если вспомнить историю ее появления) система передачи-обработки (частный случай - маршрутизация) данных. Да, живя в Москве (ну или на границе с Китаем
МК - наиболее простой на первый взгляд выход, но позвольте причем здесь Linux? Ведь программу обработки данных, полученных с RS, напишет школьник в "визуал васике" под мастдайкой.
Что касается конкретной задачи, если конечно в описании она не была упрощена до примитива, может быть имеет смысл посмотреть стробируемый режим порта и соответственно драйвер некого устойства, типа считыватель с перфоленты (смех в зале).
P.S. Прошу не воспринимать мое письмо как вызов. Просто обидно за те времена когда компы были большими а проги маленькими, да и за Linux тоже, ведь из-за отсутствия док. самый простой, к сожалению, способ нарисовать что-либо дельное - это поиск в сырцах, а ведь за командой разработчиков не угонишся.
Может быть я что-то не внимательно прочитал, но IMHO в статье не говорится о "доводки" системы, до состояния RT методом кастрации. И вообще *nix позиционируется, как (ну если вспомнить историю ее появления) система передачи-обработки (частный случай - маршрутизация) данных. Да, живя в Москве (ну или на границе с Китаем
Что касается конкретной задачи, если конечно в описании она не была упрощена до примитива, может быть имеет смысл посмотреть стробируемый режим порта и соответственно драйвер некого устойства, типа считыватель с перфоленты (смех в зале).
P.S. Прошу не воспринимать мое письмо как вызов. Просто обидно за те времена когда компы были большими а проги маленькими, да и за Linux тоже, ведь из-за отсутствия док. самый простой, к сожалению, способ нарисовать что-либо дельное - это поиск в сырцах, а ведь за командой разработчиков не угонишся.
-
astro
- Сообщения: 2
Re: Чтение состояния порта
> В зависимости от задачи компьютер должен отвечать на определнную последовательность двумя битами.
> Например, на 000 ответ 01, на 001 - 11, на 010 - 00 и т.д.
Всё зависит от задачи. Если только отвечать по такой простой логике, то это можно сделать на cpld.
Если надо иметь управление от компьютера, то тогда на любом контроллере.
Если надо иметь управление и сложную обработку только тогда смотреть на линукс (или другие ОС).
> Например, на 000 ответ 01, на 001 - 11, на 010 - 00 и т.д.
Всё зависит от задачи. Если только отвечать по такой простой логике, то это можно сделать на cpld.
Если надо иметь управление от компьютера, то тогда на любом контроллере.
Если надо иметь управление и сложную обработку только тогда смотреть на линукс (или другие ОС).
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
Объясняю на пальцах, что я хочу получить:
Вначале мне, например, нужна частота 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
В электронике я ИМХО нормально разбираюсь, но я никогда не работал с микронтроллерами... поэтому прошу разжевывать все инфу о них
Вначале мне, например, нужна частота 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: Чтение состояния порта
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.
Но перед дачей советов ты действительно должен определиться на чем будешь делать.... потому как особенности есть везде...
-
astro
- Сообщения: 2
Re: Чтение состояния порта
Стабильные 6КГц из пользовательского приложения это нереально. Варианта два - или реализовать управление из драйвера или вынести его во внешний контроллер.
По первому варианту читайте
http://www.xml.com/ldd/chapter/book/
http://lwn.net/Kernel/LDD3/
http://www.linux.it/~rubini/docs/parallela/parallela.html
По второму atmel.ru
По первому варианту читайте
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: Чтение состояния порта
2astro: а что читать человеку который не разбирается в микронтроллерах? раньше вроде сайт был avr123.nm.ru...
-
Slimy
- Сообщения: 1689
- ОС: openSuSE 11.2 GM (GеMор едишн)
Re: Чтение состояния порта
Так контроллер тот же компьтер только меньше намного и возможности скромнее. Ничего в нем сложного нет. Всетаки советую подумать насчет PIC они проще атмелов (хоть и возможности меньше) а читать на microchip.ru или в гуголе на конретный контроллер искать pdf.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: Чтение состояния порта
Ребята, не горячитесь - точно короткие промежутки времени меряются select-ом. Даже с учетом вытеснения. На несильно нагруженной системе он поможет, на сильно - никто не спасет, даже RT...
В каждом из нас спит гений... и с каждым днем все крепче...
-
Zeus
- Сообщения: 694
Re: Чтение состояния порта
Значит ли это что:
Если заблокировать поток на select'е на, допустим, 1 мкс, то РОВНО через 1 мкс, независимо от того, какой код выполнялся на процессоре - он вытеснится и управление передастся заблокированному потоку после select'а?
Коли так, то причём тут сильно-несильно загруженные системы?
И второй вопрос: получив процессор сколько времени наш поток будет к нему подключен? Гарантированно 1 квант?
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: Чтение состояния порта
Zeus писал(а): ↑20.03.2006 18:52
Значит ли это что:
Если заблокировать поток на select'е на, допустим, 1 мкс, то РОВНО через 1 мкс, независимо от того, какой код выполнялся на процессоре - он вытеснится и управление передастся заблокированному потоку после select'а?
Коли так, то причём тут сильно-несильно загруженные системы?
Если у Вас на машине помимо этого процесса бегает еще пару тыщ других, что пока они все свои кванты не отпахают - фиг, кто даст вам время, так как новый процесс попадет в активную очередь в конец - а она может быть длинной.
RT процессы обладают тем свойством, что после ухода с runqueue их не убирают в expired очередь (кто не знает как устроен новый планировщик - потом расскажу), а оставляют в активной по истечении его "кванта" чтоб он был более interactive. Ессно, что если у Вас на машине все процессы - real time, то ни о каких гарантиях и речи быть не может.
select гарантирует, что через указанное время процесс разбудят. Если очереди не сильно нагружены - то он практически тутже получит и процессор.
Конечно! В течение кванта принудитеьного вытеснения нет. Ессно, что если я буду в цикле звать yield(), то мой процесс и кванта не выживет - две инструкции жизни и мы опять в... ядре и переключаемся.
В каждом из нас спит гений... и с каждым днем все крепче...
-
Zeus
- Сообщения: 694
Re: Чтение состояния порта
Подозреваю, что "разбудят" здесь имеется ввиду не программистский термин, а системный - состояние потока?
Просто я привык, что поток "уснул" (заблокировался) - не потребляет процессорное время, "проснулся" (разблокировался) - начал выполнение.
Но раз так, то select не поможет гарантированно точно отмерять малые интервалы: select "будит" процесс, но когда он реально начнёт исполнять код - неизвестно.
-
Slimy
- Сообщения: 1689
- ОС: openSuSE 11.2 GM (GеMор едишн)
Re: Чтение состояния порта
А может проще делитель на входе замутить
если имеются заранее извесные шаги. Если с электроникой все ОК тогдаконтроллер понять раз плюнуть. Это чисто программистам сложнее т.к. они привыкли кнопки нажимать без задумок на тему какой физический процесс это вызывает. И боюсь что на частоты 100мгц и выше нужны не слабые контроллеры. Всеравно делители придется ставить как ни крути.Я тут подумал а может тогда проще микросхему аппаратного счетчика поставить? ИМХО самый лучши вариант а дальше уже все с помощь программы. И контроллер изучать не придется.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
-
Zeus
- Сообщения: 694
Re: Чтение состояния порта
Slimy писал(а): ↑20.03.2006 23:11А может проще делитель на входе замутитьесли имеются заранее извесные шаги. Если с электроникой все ОК тогдаконтроллер понять раз плюнуть. Это чисто программистам сложнее т.к. они привыкли кнопки нажимать без задумок на тему какой физический процесс это вызывает. И боюсь что на частоты 100мгц и выше нужны не слабые контроллеры. Всеравно делители придется ставить как ни крути.Я тут подумал а может тогда проще микросхему аппаратного счетчика поставить? ИМХО самый лучши вариант а дальше уже все с помощь программы. И контроллер изучать не придется.
Да давали ему уже один вариант: ПЛСы.
Но ставить программные эксперименты быстрее и дешевле, чем в электронике.
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
Охото бы проверить сам приемник... подскажите программу, которая может отобразить временную диаграмму состояния LPT порта.
-
Slimy
- Сообщения: 1689
- ОС: openSuSE 11.2 GM (GеMор едишн)
Re: Чтение состояния порта
Есть для DOS видел. Я так понимаю чтото вроде логического анализатора, искать именно по этим признакам.
Если уже ничего не помогает - прочти инструкцию.
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
sysinstall - гадость :)
ASUS A6q00Vm Pentium-M 1.7 GHz, 2Gb RAM, 160Gb HDD,
GeForce Go 7300 64Mb video
-
xorader
- Сообщения: 1030
- Статус: собирающий миры
- ОС: Debian
Re: Чтение состояния порта
В цикле примерно это юзай:
PULSE_PER_SCD -- это константа означающая сколько пульсаций (проходов в цикле) в секунду делать. Но как верно заметили товарищи выше - это не решит проблему точного срабатывания, просто этот код учитывает время работы полезного кода.
P.S. ну и man 2 select
Код: Выделить всё
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!
*offtopic* - ololo!
-
f0ma
- Сообщения: 10
Re: Чтение состояния порта
ИМХО Либо драйвер либо циклический буфер на чем нибудь типа mega8. Использовать для такой простой задачи RTL ось не имеет смысла. Порт LPT без встроенного буфера (а он там есть, но нужно его запрограммировать и тогда до 2мб/с) 700 кГц прокачивает стабильно. Если речь идет только о вводе. На базе контроллера необходимо сделать циклический буфер в который синхронно будут писаться данные и асинхронно читаться. в mega8 - 1Кб рамы то-есть проблем с переполнением быть не должно. Для упрощения программирования задается НЕЗНАЧЕНИЕ соответствующее уходу буфера в минус и НЕЗНАЧЕНИЕ2 говорящее о переполнении. Также возможна запись времени между изменениями сигнала. С IO ситуация заметно сложнее. Возможно проще логику полностью убрать в контроллер, а компьютеру отсылать уже результат обработки (тк прогу для контроллера можно написать на С...), если нет, то тут навреное проще и правда PCI планку купить.
/ Mandriva 2005 / KDE 3.3.2 /
-
sageLin
- Сообщения: 46
Re: Чтение состояния порта
Мне нужно ХОТЯБЫ проверить работу устройства. Для проверки думаю поставить Sand Linux discovery v 1.1 (RTOS) и подключить РПУ к LPT порту. Но каким софтом воспользоваться, дабы получить временную характеристику порта?
PS: Свою программу не хочу использовать, чтобы исключить возможность ошибки в исходном коде программы.
PS: Свою программу не хочу использовать, чтобы исключить возможность ошибки в исходном коде программы.