Vil84, давай больше технической инфы
Таки АЦП гонит данные через стандартный
UART? скорость обмена какая?
Тогда нехрен выпендриваться делай блокирующее чтение данных. Как только будет принят первый байт микросхема USART поместит его в приёмный буфер (4-8 байт всего) и выставит флаг прерывания. Он будет обработан практически мгновенно не незагруженой системе. Вызовится обработчик в который ты так отчаяно пытаешься залезть. Этот обработчик весьма быстро скопирует этот байт прямо в выделеный тобою буффер в user-space и отданный команде read. Дальше вызовится процедура планировщика которая из всех спящих процессов пнет именно твой птому что именно ему пришли в этот момент данные.
Системы реального времени
- это не значит бездумно лезть в ядро
- это надо понимать как оно устроено и как отреагирует на разные события
- это заранее просчитанные возможные состояния системы и врямя обработки разных задач
К тому же, в старт-стопном режиме обмена данными я не могу рассчитывать на чёткие временные интервалы между двумя сигналами.
А теперь по русски. Че сказать хотел? Чёткие временные интервалы тебе обеспечены будут если на системе больше ни чего другого крутиться не будет, что может притормозить обработку сигнала когда будет вызван другой процесс вместо твоего. Опять же только необходимые процессы в системе, система приоритетов и выбор правильного планировщика заданий позволят тебе сделать гарантированное время откликак по RS232'у порту из обычной пользовательской программы. Это на порядки проще чем писать свои обработчики прерываний не особо понимая что делаешь.
Насколько я понимаю, обработка прерываний от ком-порта в этом случае - самый правильный способ.
не правильно понимаешь. тоесть конечно это гарантирует что твой код первый кто узнает о том что пришли данные, но вот остальная часть слишком уж не тривиальна.
Программа реагирует на пришедший в порт байт именно по факту его получения
Таки отреагирует имеено на пришедшие байты. Именно по факту получения. Без лишнего гемороя.
Я тут конечно распинаюсь, но ты мне нифига не веришь и сидишь пальцем у виска крутишь. Тогда другой вопрос: а ты пробовал чтобы говорить что это не работает? код в студию! сдается мне там будет страшный копец который вообще не должен работать. мы все дружно поржём и скажем как на самом деле надо было написать.
Если реально сильно быстро и сильно критично повесь туда ARM на гигагерц, выкини вообще 232й интерфейс (довольно медленнная штука), прямо в арм вшей всю логику.
RT-Linux это кстати ядерные задачи которые именно обработчики прерываний и + обычный линукс который сам крутится рядом с ними как одна из задач. как то приблизительно так.
Пользователь решил продолжить мысль [time]Wed Feb 9 20:27:11 2011[/time]:
от куда 24 милисекунды? расчётное подлетное время? я умножил 24000 на 8 и получил сильно знакомую цифру в 192000 (bps надо полагать). Признавайся ты именно так получил эту цифру =)
Открою секрет. там не 8 бит на каждый байт. как минимум 10: старт бит, 8 бит данных, опциональный бит чётности и стоп бит. Бит данных может быть кстати меньше.