Работа с PCI устройствами

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Работа с PCI устройствами

Сообщение Aleskey » 02.02.2007 14:02:16

Никак не получается прочитать данные из PCI устройства (ПЛИС Altera), подключенного к шине PCI.

В устройстве реализована память размером в 1МБайт. При инициализации, BIOS назначает базовый адрес, который успешно считывается функцией PCI BIOS 1Аh. (Находим устройство, читаем конфигурационное пространство). Работаем в защищенном режиме.
Создается селектор, устанавливается базовый адрес дескриптора, равный прочитанному базовому адресу из конфигурационного поля устройства, устанавливается предел в 1МБайт (или ниже для проверки). При попытке считать байты из памяти командой seg_move() возникает Runtime error 216 at $... Назначаемый базовый адрес всегда $EFC00000. Машина - AMD Geode LX800, x86 совместимая.
Причем изредка программа работает, но максимальное смещение, по которому читаются данные - это $FFF, далее все таже ошибка! Что я должен прочитать я знаю! Устройство рабочее, есть альтернативные программы на visual c и ASM.

Уважаемые специалисты, подскажите как быть. Как читать память устройства, а то все примеры - как работать с буфером видеоадаптера или с областью памяти DOS.

(Применительно к FP для GO32v2 Dos extender. Compiler version 2.0.4)
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59

Сообщение Aleskey » 02.02.2007 19:10:22

Методом "научного тыка" :cry: ,я выяснил, что как только я хочу установить базовый адрес дескриптора, превышающий или равный 1МБ (предел дескриптора памяти DOS), то программа вываливается с ошибкой Runtime Error 216 (превышение предела памяти!?). Если ниже 1МБ, то как только, я дохожу до предела 1МБ, при чтении данных, тоже самое - RTE 216. А мне нужен адрес $EFC00000. Как выйти из этой ситуации, незнаю. За ASM садиться неохото, долго код набирать. :D
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59

Сообщение Sergei I. Gorelkin » 02.02.2007 23:01:13

Надо смотреть те функции, которые создают дескрипторы... В самой seg_move() глюкам взяться вроде бы неоткуда.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Aleskey » 05.02.2007 08:57:36

Дескриптор получаю так:
selector:=allocate_ldt_descriptors(1);
set_segment_base_address(Selector,SelectorBase);
set_segment_limit(Selector,SelectorLimit);
и все.
Разве эта проблема не связана с расширителем DOS (16 bit). Ведь DOS, вроде бы, использует только 1 МБ памяти и я не могу адресовать все адресное пространство в 4 ГБ.
Я считал, что компилируя из FP для GO32 v2 DOS extender, программа пререйдет в защищенный режим и так как это 32битный компиллятор, то я смогу адресовать все пространство без проблем. Судя по всему здесь есть какой-то секрет! :?:
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59

Сообщение Sergei I. Gorelkin » 05.02.2007 11:00:45

Мда, все функции получения дескриптора просто обращаются к INT 0x31, и имеется комментарий "работает только с настоящим DPMI".

Проблема в том, что Go32 не предоставляет DPMI? Нужно читать документацию... Что-то можно выяснить по значениям, которые возвращают set_segment_base_address() и set_segment_limit() - вроде бы должны TRUE возвращать, если все правильно. Может быть, что-то в самой Go32 подкрутить.

Наконец, если есть рабочая программа на ассемблере (а как она получает дескриптор :?:), ее не так уж трудно объединить с FPC - либо вставкой отдельных функций в текст, либо линковкой с .obj.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Aleskey » 05.02.2007 18:58:14

А кто выдает мне эту ошибку?
Просто не может такого быть, что код должен работать нормально (я так понимаю, что программа переводит машину в защищенный режим), но отладчик отслеживает обращение программы и выдает сообщение об ошибке. Не знаю почему, но пару раз на экране появлялись верные данные по адресу EFC0 0000h - EFC 0FFF. Но после перекомпиляции адресация дальше мегабайта стала невозможной. Возможно я менял опции компилятора :shock:
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59

Сообщение Sergei I. Gorelkin » 05.02.2007 22:29:05

Ошибка 216 - результат обращения по недопустимому адресу памяти, из-за чего сам процессор кидает исключение.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Aleskey » 06.02.2007 09:14:34

тогда почему пару раз мне удалось прочитать данные EFC0 0000h - EFC 0FFF. :?:
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59

Сообщение Sergei I. Gorelkin » 06.02.2007 10:08:02

Сложно сказать. Можно строить всякие предположения, но если это было пару раз и невозможно воспроизвести - проще плюнуть и не париться...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Aleskey » 06.02.2007 10:20:19

А не может проблема быть с тем, что функция работает с локальной дескрипторной таблицей?
Aleskey
незнакомец
 
Сообщения: 6
Зарегистрирован: 02.02.2007 13:41:59


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru