Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Остановка цикла MainLoop

Вы не вошли.

 Поиск | Регистрация | Вход 

Сергей Гребенюк
11.08.2003 16:32:24
#1

Гость

Остановка цикла MainLoop

Я наблюдаю непонятный эффект. В штатном биосе в цикле MainLoop происходит “параллельный” ввод-вывод данных через порт. В случае, когда буфер АЦП заполнен блоком данных – генерируется прерывание и данные посылаются в порт по слову за каждый проход цикла MainLoop. Другими словами, данный цикл должен постоянно выполняться независимо от того, передаются данные в PC или нет.  А у меня сразу после первого прерывания в PC, происходит остановка цикла на время до следующего прерывания. Причем, если закомментарить генерацию прерывания ( AR=IO(INTERRUPT) ), цикл не прерывается(данные,естеств. тоже компьютером не читаются).

В цикле MainLoop я вызываю тестовую функцию, генерирующую импульс на цифровом выходе, так и отлаживаю.

А все началось с того, что при передаче по ПДП, в начало потока вставляется левый кусок, размером в прерывание. Если не пропускать первое прерывание от АЦП, то вставляется два таких куска.

Если отказаться от ПДП, то данные вообще не передаются. Попытка прочитать данные асинхронно (без чтения битов готовности ) вызывает мертвое зависание компьютера. Пытаюсь читать синхронно – вижу, что происходит какая-то фигня с битами готовности от DSP (это еще предстоит отловить). Вобщем, нормально данные не читаются. Может с платой что-то не то?

Что происходит?

И еще вопрос: если PC записал в порт данных слово, а затем DSP сначала выводит слово в порт данных а потом читает из порта, то какое слово он прочтет?

Я работаю с пофиксеной версией штатного биоса и драйвером от lcomp. Кстати, должен отметить, что lgraph на моей машине вешает машину намертво.

12.08.2003 08:38:25
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Остановка цикла MainLoop

Ну с lcomp драйверами L-Graph работать и не должен.
А по остальному ждите ответа Тихомирова Сергея.

12.08.2003 09:32:18
#3

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Остановка цикла MainLoop

А штатные примеры со штатным LBIOS под DOS и Windows работают исправно?

Сергей Гребенюк
13.08.2003 13:15:19
#4

Гость

Re: Остановка цикла MainLoop

Под дос не пробовал. Под Windows есть только один простенький пример, который, вроде, работает.

Но все не так просто. После того как я подал выходы ЦАПа на вход АЦП, получилось следующее.
Синусоида с цапа читается без левых вставок спереди, как полагается. Но отличие работы примера от моей ситуации в том, что данные для цапа загружаются в буфер платы ПЕРЕД началом работы. Я же формирую сигнал В ПРОЦЕССЕ оцифровки данных, посылая в определенные моменты команды через порт данных, ориентируясь при этом на прерывания от таймера и от АЦП.

Так вот, случается непонятное. Если, скажем, прямоугольный импульс нарисовать в буфере ЦАП перед началом работы, то он оцифруется верно. Но если этот импульс формировать (командами от PC) после начала работы но с такой же задержкой, то я получаю ту же картинку, но с левым куском спереди.

1 Где могут быть проблемы?

2. Зачем пропускать первое прерывание от ЦАП/АЦП, если работаем по ПДП? То есть, что получается, если не пропускать, я видел,-появляется еще один левый кусок спереди потока, но почему это происходит?

3. Как выглядит протокол общения платы с PC и ПДП контроллером , когда порция данных с АЦП готова и их предстоит передать по ПДП? Может быть здесь я что-то не учитываю, по незнанию?

14.08.2003 10:58:21
#5

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,493

Re: Остановка цикла MainLoop

Дык, вроде бы в тех.описании всё более-менее подробно об этом сказано... Попробуем ещё раз...
1. Вывод данных на ЦАП осуществляется только из FIFO буфера ЦАП. Так что после запуска ЦАП вывод начинается именно из этого буфера. А в процессе работы ЦАП Вы можете только подгружать в FIFO буфер ЦАП новые порции данных (по мере их необходимости и готовности) на место УЖЕ выведенных. Поэтому если Вы предварительно, перед стартом ЦАП, не проинициализировали буфер ЦАП нужными данными, то в итоге и получили на выходе ЦАП после его запуска левый кусок длиною в целый буфер.
2. Рассмотрим для примера работу с ЦАП по ПДП+прерывания. Для начала следует проинициализировать FIFO буффер ЦАП и буфер ПДП необходимыми данными. Потом можно запустить в работу ЦАП. После вывода на ЦАП первой порции отсчётов из FIFO буфера ЦАП, DSP сгенерит первое прерывание в РС и будет готов принять новые данные на место уже выведенных. Контроллер ПДП начнёт заливку этих данных из первой части буфера ПДП. При этом, как видно, никакие данные нигде изменять не нужно. Поэтому это прерывание как бы пропускается. Далее, после вывода на ЦАП второй порции отсчётов из FIFO буфера ЦАП, DSP сгенерит второе прерывание в РС. Контроллер ПДП начнёт заливку данных из второй части буфера ПДП. А данные в первой части буфера ПДП следует заменить на новые. И так далее по циклу...
3. DSP платы вообще знать не знает ни о каком ПДП. Его задача собрать определённое кол-во данных с АЦП в себе в буфер, сгенерить, если надо, прерывание в РС и осуществить выдачу собранного через порт данных. Просто если Вы в РС работаете по ПДП, то он должен быть заранее корректно сконфигурирован и полностью готов к приёму информации из платы.

Сергей Гребенюк
18.08.2003 17:44:20
#6

Гость

Re: Остановка цикла MainLoop

У меня такое впечатление, что Вы невнимательно читали мое письмо. Спасибо, конечно, за цитирование инструкции к плате, но, как Вы понимаете, мне это ничего не дало.

А результатов я достиг, потратив ту кучу времени, которую, по идее должна была потратить ваша команда разработчиков.

Например, кто мне ответит, зачем нужен фифо буфер на плате при работе по ПДП? Правильно, нафиг не нужен. Если слово после оцифровки сразу передавать по ПДП, то все становится прекрасно. Не нужно пропускать никаких прерываний, и более того, возможна реальная синхронизация работы платы и процесса обработки данных. Кстати, левый кусок спереди потока данных исчез, потому что он создавался именно рассинхронизацией оцифровки данных и ее передачей в PC именно из-за пропуска прерывания.

Если бы Вы мне еще и денежку вернули, за то что я сделал чью-то работу, было бы вообще прекрасно.
Шутка.

Сергей Гребенюк
18.08.2003 17:50:26
#7

Гость

Re: Остановка цикла MainLoop

И еще. Когда я анализировал код биоса и драйвера, я увидел, что у вас есть достаточно хорошие кодеры, но не хватает хороших девелоперов.

Ужасно, если и для новых плат софт написан так же халтурно.

Спасибо за оказанную помощь и код драйвера.