|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.05.2017, 15:22 | #1 |
Форумчанин
Регистрация: 17.07.2012
Сообщений: 140
|
Как в МК работают аппаратные прерывания?
Я не знаю какой у меня МК, на самой плате он заклеен, а отрывать нельзя плата на гарантии. Мне нужно настроить код по аппаратному прерыванию МК. Можете ли как то примитивно (в несколько предложений/кратко) объяснить как работают аппаратные прерывания в МК. В инструкции от разработчика платы написано следующее:Обработка прерываний
Во всех режимах устройство при работе генерирует прерывания. Каждое прерывание обрабатывается драйвером, а затем тем или иным образом информация о прерывании передается пользовательской программе. Механизм передачи информации о прерывании различен для разных ОС. В DOS драйвер прямо из своего обработчика прерываний вызывает пользовательский код, оформленный в виде специальных функций, таким образом, программист имеет возможность встроить свой код прямо в обработчик. Программа написана на с++, я так понимаю, что каждое аппаратное прерывание МК запускает какую-то пользовательскую функции и в ней выполняется обработка этого прерывания? Или в разных МК по разному реализована настройка аппаратного прерывания? |
03.05.2017, 16:22 | #2 | ||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
Цитата:
Цитата:
|
||
03.05.2017, 18:22 | #3 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
В инструкции у вас говорится про прерывания ПК(ЭВМ) а не про МК. Прерывания в ДОС просты.
Карта у вас ISA или PCI? Или у вас там Com? Короче МК дёргает линию прерывания. Путём выставляет, а потом снимает сигнал(напряжение). Контроллер прерываний PIC запоминает в защёлке, что проскочило прерывание. Проверяет разрешено оно или нет. Это называется замаскировано прерывание или нет. Контроллер прерываний отсчитывает с какой ноги пришло прерывание и передаёт этот номер в ЦП. Когда ЦП получит номер прерывания он вызывает функцию из таблицы прерываний IDT по этому номеру. В дос эта таблица находиться по адресу 0000h:0000h. Эта таблица имеет простую структуру - массив указателей на функции. Указатели длинные(far) сегмент:смещение) . ЦП вызывает функцию по её номеру. Вызов этот в точности соответствует инструкции INT xx, где xx номер. Инструкция INT сохраняет регистр флагов и адрес возврата в стеке. Обработчик должен сохранить регистры в стеке перед тем как сможет их использовать. Далее идёт обработка прерывания. На одном прерывание может сидеть несколько железок. Поэтому обработчик прерывания проверяет его ли железка выдало прерывание. Проверка идёт по особым флагам, уникальным для каждой железке, скажем через регистры или порты вашего МК. Если железка его, то обработчик прерывания снимает защёлку с pic и отдаёт управление прикладному коду. Если не его, то отдаёт управление по цепочке другому обработчику(который сидел на том же прерывании до него). Для выхода из прерывания используется команда IRET. INT и IRET работают в паре Тут сказано что драйвер вызывает колбек из прикладного кода. Скорее всего это происходит до IRET. Повторные прерывания запрещены. Это значит что пока ЦП не вызовет IRET они не будут восприняты. Поэтому такой колбек должен быть коротким что-бы не пропустить следующее прерывание. И есть и другие причины по которой прерывания и клбеки должны быть короткими. Но тут есть ещё вторая проблема. Прерывание может появиться когда угодно и где угодно. Может так случиться что пока программа заполняла структуру к примеру struc point {int x; int y}; пришло прерывание и она оказалась частично заполнена. Процессор успел заполнить только x, а y не успел. Тогда эту структуру нельзя использовать до выхода из прерывания. Что-бы гарантированно иметь все структуры целыми надо синхронизироваться. Есть простой способ просто сохраняем в колбеке флаг прерывания и выходим из него. При использовании флага мы сможем гарантировать состояния всех объектов. Далее обработчик прерывания восстанавливает ход прикладной программы вызовом IRET. На границе функций у нас объекты всегда заполнены. Поэтому достаточно в основной цикл прикладной программы периодически проверять флаги. Или же организовать асинхронные вызовы, но это уже более сложная методика и к разговору не имеет отношения. Или всё построить на прерываниях, тогда за синхронизацию будет отвечать сам контроллер прерываний. В МК прерывания работают примерно так же. Хотя надо знать что за МК. Таблица прерываний там короче. Контроллер прерываний по-проще. Да и в некоторых МК есть специальные регистры для обработки прерываний что-бы каждый раз не сохранять их в стеке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . Последний раз редактировалось Pavia; 03.05.2017 в 20:13. |
04.05.2017, 00:17 | #4 | |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Цитата:
|
|
04.05.2017, 08:24 | #5 | ||
Форумчанин
Регистрация: 17.07.2012
Сообщений: 140
|
Операционка есть, это MS-DOS. Код программы на с++, зачем разрешение операционки на это прерывание, если оно по идее по вектору прерывания МК должно запустить определенную функцию с++ в самой операционке?
А может это и не МК, вот есть такая платка для управления интерфейсом УСТРОЙСТВА СОПРЯЖЕНИЯ Описание программной модели устройств серии ТА ГФКП.00254-01 92 01 и там на 6й странице написано Базовый состав устройства Функции управления протоколом в режимах КК, ОУ, МСО и МСЛ реализованы в микросхеме Actel. Кроме того, микросхема Actel содержит внутреннее FIFO прерываний и внутреннее RAM регистров управления. В устройстве имеется ДОЗУ данных емкостью 64К слов и интерфейсная часть. В настоящее время реализованы интерфейс ISA-16, ISA-8 интерфейс моста PCI9030 и интерфейс процессора 1892ВМ3Т (МС-12). Я подумал, что микросхема Actel это микроконтроллер, а по вашему ответу я так понимаю эта микросхема может быть всем чем угодно, в том числе и плисиной, но не МК? Цитата:
Признак АК формируется только при чтении регистра в режиме ОУ и равен «1» если в момент чтения микросхема находится в состоянии обработки поступившей из МК команды. 1.2 Регистр вектора прерывания (РВП). Адрес 0001 № Регистр вектора прерывания 15 Признак загруженности FIFO 14 Переполнение таймера 13 Собственная генерация устройства 12 Номер версии устройства 11 Не используется 10 Переполнение FIFO 9 - 0 Адрес блока (FIFO на 256 слов) это не прерывания ПК, это прерывания или МК или какой-то другой микросхемы, например ПЛИС карта PCI во первых это не дос, во вторых как писать код аппаратного прерывания в досе я знаю, писал и для сом порта по 7й ноге и для клавиатуры на ассемблере. что такое колбек не понял. Цитата:
почему то на плате наименование этой микросхемы заклеено, написано только что это микросхема Actel, не знаю даже где посмотреть, правда по этой тематике есть форум у разработчика микросхем интерфейсных плат на базе стандарта MIL STD 1553B, но там почему то не проходит регистрация, поэтому несколько дней уже топчусть на месте и не могу разобраться как работает аппаратное прерывание. Последний раз редактировалось Аватар; 04.05.2017 в 10:24. |
||
04.05.2017, 09:53 | #6 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Ой, какой кошмар - столько сообщений подряд! На radiokot.ru за это уже получил бы ата-та по попе.
Насчет Acte - я с ними не работал, потому не утверждаю, что это - не МК, узнал вот по источникам, что Actel специализируется на ПЛИС, но на ПЛИС можно сообразить что угодно, в т.ч. и МК с системой команд, заточенной под конкретную задачу. Так что оно может быть и ПЛИС, и МК одновременно. |
04.05.2017, 10:36 | #7 |
Форумчанин
Регистрация: 17.07.2012
Сообщений: 140
|
|
04.05.2017, 10:54 | #8 | ||
Старожил
Регистрация: 04.02.2011
Сообщений: 4,550
|
Я - не мордератор, бить не уполномочен. Обычно если ответ на короткую реплику и сразу, то можно не цитировать, а если на большое сообщение отвечаем по частям, то выделяем в сообщении первый тезис - отвечаем, второй - отвечаем и т.д. Например:
Цитата:
Цитата:
Последний раз редактировалось digitalis; 04.05.2017 в 10:56. |
||
04.05.2017, 11:08 | #9 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Вообще-то там на документацию написан что у вас стоит АРА150-PQ208.
Это ПЛИС! Там либо прошивка с микроконтроллером либо с автоматом. Ранее ПЛИС принадлежала Actel пока их не купил Microsemi. Цитата:
Тут просто внутри вашей платы ещё ряд прерываний. А проводов прерываний у PCI платы всего 4, но используется только 1. Вот что-бы запихать все прерывания в одну линию используется регистр РВП. Обработчик драйвера проверяет какое это прерывания и выполняет нужные действия. На самом деле там сложнее так как у вас мультиплексор. Поэтому у них там ещё организована очередь прерываний(FIFO прерываний).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
04.05.2017, 14:15 | #10 |
Форумчанин
Регистрация: 17.07.2012
Сообщений: 140
|
Но ведь ФИФО я думаю подразумевает 1й пришел, 1й вышел, те нужное мне прерывание как аппаратное работать уже не будет? (там же нет возможности чтения конкретного прерывания как в векторе прерываний в досе) ? Мне придется прочитать в Фифо все данные, прежде чем понять, есть там мое прерывание или нет? Допустим меня интересует прерывание поступления данных из КК в ОУ. Если буфер Фифо 256 байт, тактовая частота процессора 180мгц, или 0,005мкс, пусть 1 байт считывается за 10 тактов процессора, это займет 0,05 мкс, до последнего прерывания я доберусь через 10 мкс, ну наверно такое прерывание можно назвать аппаратным. Следовательно нужно искать в драйвере, по логике, функцию этого одного прерывания от платы? (Я понимаю, что обратился к вам не по адресу, мне нужно на другой форум, более близкий к теме, но сроки поджимают, а на тот форум не могу попасть) (Мне еще повезло, что вы отвечаете, а то на киберфоруме сразу забрасывают гнилыми помидорами вместо ответов, повторяя одно и тоже, что дос умер 20 лет назад)
это какое одно вы имели в виду? И спасибо за APA150-PQ208, я это не нашел... Ну все нашлись добрые люди, подсказали, показали, научили. Оказалось прерывание у платы PCI можно посмотреть программой sisinfo , прерывание IRQ11 INTA#. Тему наверно можно закрыть. Последний раз редактировалось седьмой; 04.05.2017 в 16:41. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не работают прерывания | xotonic | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 4 | 24.10.2014 21:18 |
скрипты для OlliDbg- как они пишутся и как работают | Dimka-novitsek | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 1 | 14.10.2014 16:50 |
Как работают фрилансеры? | Izobara | Свободное общение | 22 | 15.04.2013 09:55 |
А как работают антивирусы? | MooNDeaR | Свободное общение | 35 | 04.01.2012 16:21 |
Делфи и ассемблер. Не работают прерывания типа Int | Я_и | Общие вопросы Delphi | 8 | 11.12.2010 13:13 |