Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Работа с внешней платой. (IRQ, ввод вывод данных с |
Автор: TIMA101 17.4.2006, 08:02 |
У меня такая проблема. Иметься у нас плата АЦП фирмы Octagon модель 5710. Она вставляется в порт ISA. Путем установки перемычек можно установить базовый адрес платы (100H, 110H, …170H). Управление платой происходит путем записывания определенных битов (байтов) в адреса платы. Например, запуск преобразования платы происходит путем записи числа 255H на адрес BASE + 0, где я понял BASE – это базовый адрес. Считывание информации также происходит с определенных адресов. В Turbo – C используют операторы outportb и inportb(например outportb(0×21, а), inportb(BASE_5710 +2). Подскажите какие аналогичные операторы можно использовать в VC!!! Это первый вопрос. Еще при считывании информации мне нужно использовать прерывания IRQ, я так понял для этого нужно использовать класс CIM_IRQ. Мне бы кто-нибудь прокомментировал бы его на примере. Честно говоря с понятием базового адреса я впервые столкнулся на этой плате, если у кого есть опыт работы с такой или аналогичной платы пишите и/или дайте ссылок. Это мой диплом, а осталось 1,5 месяца. Помогите бедному студенту Заранее спасибо! |
Автор: chaos 17.4.2006, 10:48 |
читай DDK |
Автор: Janus 17.4.2006, 11:03 |
Халява! У нас лабы такие. Рыть надо в сторону всетаки не VC++, а Assembler. Например, ознакомься с топиком: http://forum.vingrad.ru/index.php?showtopic=58178. Возможны ассемблерные вставки в программу на C++ или отдельный модуль на асме. |
Автор: adonin 17.4.2006, 16:52 |
Не к ассемблеру, а к драйверу нулевого кольца. sgi1981 дал хорошую ссылку. Считаю необходимым повторить: http://www.beyondlogic.org/porttalk/porttalk.htm |
Автор: Janus 17.4.2006, 18:15 |
Да, и это тоже. В принципе, говорят, на С тоже можно работать с портами, но сам не знаю - не пробовал. |
Автор: TIMA101 18.4.2006, 06:20 |
Разве нету каковонибудь оператора в С++ который мог бы записывать в определенный адресс определеннлое значение, без асемблера? С портом незачем работать это точно. На турбо си вся программа состоит из двух операторов outportb(0×21, а), inportb(BASE_5710 +2)! Которые записывают и считывают данные с платы. Там есть байт готовности. Когда он равен 1 считываю данные, он снова становиться равен нулю, я опять жду когда он будет равен еденицы... Все считанные данны я записываю в файл... На Турбо СИ все так просто! И еще я не знаю, что такое драйвер нулевого кольца... Может уж я думаю не под винду, а под ДОС писать... Спасибо за проявленную активность ![]() Добавлено @ 06:26 Вообще даже IRQ запросы не надо использовать. В ссылке которую вы дали я еще глубоко не разбирался, но при беглом осмотре там тоже используються эти два простых оператора: outportb(0x378, 0xFF); value = inportb(0x378); Куда делись такие хорошие операторы в VC!!! Добавлено @ 06:29 И кстати я не знаю, что такое DDK!!! Я далеко не гуру в С++... Добавлено @ 06:34 Еще что такое DDK... Я далеко не гуру в С++... |
Автор: chaos 18.4.2006, 07:01 |
смотри в мсдн раздел Device Input and Output Control (IOCTL) TIMA101, DDK device development kit |
Автор: TIMA101 18.4.2006, 07:54 |
Вот хоть какая то зацепка. Спасибо chaos! Щас буду разбираться! Но пока тема не закрыта!!! Добавлено @ 08:00 adonin!!! Ты меня не пугай!!!Насчет драйвера не уверен надо поискать. Вроде в тех описании насчет драйвера ничего не ту!!! Писать драйвер, меня от этого сразу в холод и жар бросает... Щас если драйвер не найду то придеться что другое делать... Добавлено @ 08:03 adonin!!! Точно писать драйверы не сложно? Можно за неделю, вторую научиться? Там они пишуться на чем На С++ или на асемблере. Если на асемблере то это труба, ни когода его не юзал... |
Автор: TIMA101 18.4.2006, 08:10 |
Я встрял плакал мой красный диплом, хоть какой-нибудь получить ![]() |
Автор: adonin 18.4.2006, 08:14 | ||
Не сложно. Нужно только DDK где го раздобыть. Там много примеров и всё описано. Но если лень читать by English, могу выслать книжку на русском. Правда она криво распознана, и примеров в ней нет. Но базовые представления об архитектуре NT и структуре драйвера она даёт. Примеров полно в интернете. Сейчас поищу что нибудь. Пишутся драйверы на С++. Если нужно, Вы всегда можете сделать ассемблерную вставку в С++ код. |
Автор: TIMA101 18.4.2006, 08:18 |
Пожалуйсто делайте поправку что я не гуру в С++. Если что нибудь найдете шлите на ящик [email protected]. Спасибо вам за оказанное внимание ![]() Добавлено @ 08:24 Ксати adonin, мой номер аськи 234226513. Если что хотелось с вами держать связь... |
Автор: adonin 18.4.2006, 08:39 |
TIMA101, выслал Вам книгу, и статейку одну. Там примеров несколько. Насчёт аськи: у меня её на шлюзе режут ![]() Добавлено @ 08:40 Если что, пишите в PM или на e-mail. (Значки внизу поста) |
Автор: TIMA101 18.4.2006, 09:10 |
А вот под ДОС писать не легче будет? |
Автор: adonin 18.4.2006, 09:49 |
Легче. Dos не переводит процессор в защищённый режим, значит нет понятия привилегированных команд. Поэтому то в Turbo C и прокатывает outportb и inportb. Просто Вы спросили, как это сделать на VC, я вам ответил ![]() |
Автор: Lotrex 19.4.2006, 21:47 |
А с самой платой никаких драйверов и API нету? Есть ишшо такая Numega Driver Studio. Вроде бы с ее использованием еще проще... А вообще, если можно - то надо писать под ДОС для начала. |
Автор: TIMA101 20.4.2006, 06:09 |
Посоветуйте как под ДОС написать для начала!!! |
Автор: TIMA101 20.4.2006, 08:14 |
Мне нужно только записывать некие значения в определенные адресса платы (BASE_5710 +2)... Прерывания я уже передумал использовать . Считывать значения я собираюсь через бит готовности. Когда он равен 1 считываю значения, жду когда он будет равен нулю и.т.п. Мне нужно лишь напрямую работать с паматью!!! Согласен даже на ДОС . Может нужно использовать ассемблеровские вставки? Я там уж погрузился в чтение про нулевое кольцо... Короче пишите и спасибо за оказанное внимание!!! |
Автор: Janus 20.4.2006, 11:23 |
Ну так тебеж сказали, с портами работать через in/out - на асме (вставку сделай). Это будет работать под ДОС. Чтобы тоже самое работало под Win, нужно сунуть прогу куда-то в реестр, чтобы она работала в нулевом кольце. Но у меня тоже вопросик возник. Если я пишу под Win, как мне заменить ф-ции чтения/записи? Т.е. какая-то прога решила записать/прочитать что-то в/из COM. Нужно сделать так, чтобы эти операции происходили через мои процедуры. Как? Объявить и экспортировать какие-то спец. функции? Какие? Вообще, может, кто знает, где прочитать про написание драйвера под Win? |
Автор: adonin 21.4.2006, 10:57 | ||||||||
Используйте outportb и inportb, или
Это не поможет, в нулевое кольцо так не залезть. Перехватывайте API функции или пишите драйвер-фильтр.
В DDK самое полное описание. Или же Google: http://ishodniki.ru/list/?cat=6&show=cpp_vxd Добавлено @ 11:07 http://www.xakep.ru/local/search/result.asp?scope=+%22%2Fxpost%22%2C+%22%2Fmagazine%2Fxa%22%2C+%22%2Fmagazine%2Fxs%22%2C+%22%2Fmagazine%2Fxh%22+&orderby=rank&tosearch=%CD%E0%EF%E8%F1%E0%ED%E8%E5+%E4%F0%E0%E9%E2%E5%F0%E0 |
Автор: TIMA101 22.4.2006, 20:10 |
Мне бы подробнее как через асм всавку значение переменной записать в определенную ячейцу и считать значение переменной из определенной ячейки. Еще глупый вопрос: Память платы получаеться как бы видима компьютером и она адрессуеться через базовый адресс, как бы становиться частью памяти компа... ![]() Артем тебе спасибо за такое бескорыстное внимание! |
Автор: TIMA101 22.4.2006, 20:34 |
Еще вопросик: out Port, Data port - это адресс, если да то в каком виде Data - это имя перемменой, если да то какого типа.. |
Автор: DvarfInkvizitor 25.10.2006, 20:52 |
Adonin, есть вопросик (никогда не писал на C++, с ассемблером знаком очень мало): //мне нужно организовать передачу команд и данных с платой, установленной в ISA. Нужно ли как-то инициализировать работу с данным портом? Если да - то как? //надо под DOS в Turbo C. |