Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Инженерный раздел > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 03.05.2017, 16:22   #1
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Адрес: Киров
Сообщений: 140
Репутация: 10
По умолчанию Как в МК работают аппаратные прерывания?

Я не знаю какой у меня МК, на самой плате он заклеен, а отрывать нельзя плата на гарантии. Мне нужно настроить код по аппаратному прерыванию МК. Можете ли как то примитивно (в несколько предложений/кратко) объяснить как работают аппаратные прерывания в МК. В инструкции от разработчика платы написано следующее:Обработка прерываний

Во всех режимах устройство при работе генерирует прерывания. Каждое прерывание обрабатывается драйвером, а затем тем или иным образом информация о прерывании передается пользовательской программе. Механизм передачи информации о прерывании различен для разных ОС. В DOS драйвер прямо из своего обработчика прерываний вызывает пользовательский код, оформленный в виде специальных функций, таким образом, программист имеет возможность встроить свой код прямо в обработчик.
Программа написана на с++, я так понимаю, что каждое аппаратное прерывание МК запускает какую-то пользовательскую функции и в ней выполняется обработка этого прерывания? Или в разных МК по разному реализована настройка аппаратного прерывания?
седьмой вне форума   Ответить с цитированием
Старый 03.05.2017, 17:22   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,454
Репутация: 2631
По умолчанию

Цитата:
что каждое аппаратное прерывание МК запускает какую-то пользовательскую функции и в ней выполняется обработка этого прерывания?
Если нет ОС или она позволяет это делать, если это не зарезверированное под внутренние нужды, если функция повешана на это прерывание, если оно разрешено у мк, ... но вообщем как-то так.

Цитата:
Или в разных МК по разному реализована настройка аппаратного прерывания?
Общие подходы похожи. Но бывают различные типы прерывания, бываю вложенные, бывает различное количество и т.д.
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 03.05.2017, 19:22   #3
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,816
Репутация: 1956
По умолчанию

В инструкции у вас говорится про прерывания ПК(ЭВМ) а не про МК. Прерывания в ДОС просты.
Карта у вас 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 в 21:13.
Pavia вне форума   Ответить с цитированием
Старый 04.05.2017, 01:17   #4
digitalis
Профессионал
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Адрес: Минск
Сообщений: 1,563
Репутация: 549
По умолчанию

Цитата:
Да и в некоторых МК есть специальные регистры для обработки прерываний что-бы каждый раз не сохранять их в стеке.
Не слышал о таком, хотя МК занимаюсь давно. Можете привести пример ?
digitalis вне форума   Ответить с цитированием
Старый 04.05.2017, 09:24   #5
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Адрес: Киров
Сообщений: 140
Репутация: 10
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Если нет ОС или она позволяет это делать
Операционка есть, это MS-DOS. Код программы на с++, зачем разрешение операционки на это прерывание, если оно по идее по вектору прерывания МК должно запустить определенную функцию с++ в самой операционке?

Цитата:
Сообщение от digitalis Посмотреть сообщение
Не слышал о таком, хотя МК занимаюсь давно. Можете привести пример ?
А может это и не МК, вот есть такая платка для управления интерфейсом УСТРОЙСТВА СОПРЯЖЕНИЯ Описание программной модели устройств серии ТА ГФКП.00254-01 92 01 и там на 6й странице написано Базовый состав устройства
Функции управления протоколом в режимах КК, ОУ, МСО и МСЛ реализованы в микросхеме Actel. Кроме того, микросхема Actel содержит внутреннее FIFO прерываний и внутреннее RAM регистров управления. В устройстве имеется ДОЗУ данных емкостью 64К слов и интерфейсная часть. В настоящее время реализованы интерфейс ISA-16, ISA-8 интерфейс моста PCI9030 и интерфейс процессора 1892ВМ3Т (МС-12).
Я подумал, что микросхема Actel это микроконтроллер, а по вашему ответу я так понимаю эта микросхема может быть всем чем угодно, в том числе и плисиной, но не МК?

Цитата:
Сообщение от Pavia Посмотреть сообщение
В инструкции у вас говорится про прерывания ПК(ЭВМ) а не про МК. Прерывания в ДОС просты.
Спасибо за ответ, вы очень расширенно ответили на вопрос, очень приятно читать, но понятно далеко не все, вот в этом вы кажется не правы, так как в данной инструкции на 8й странице написано ГФКП.00254-01 92 01
Признак АК формируется только при чтении регистра в режиме ОУ и равен «1» если в момент чтения микросхема находится в состоянии обработки поступившей из МК команды.
1.2 Регистр вектора прерывания (РВП). Адрес 0001 № Регистр вектора прерывания
15 Признак загруженности FIFO
14 Переполнение таймера
13 Собственная генерация устройства
12 Номер версии устройства
11 Не используется
10 Переполнение FIFO
9 - 0 Адрес блока (FIFO на 256 слов)

это не прерывания ПК, это прерывания или МК или какой-то другой микросхемы, например ПЛИС

Цитата:
Сообщение от Pavia Посмотреть сообщение
Карта у вас ISA или PCI?
карта PCI

Цитата:
Сообщение от Pavia Посмотреть сообщение
В дос эта таблица находиться по адресу 0000h:0000h
во первых это не дос, во вторых как писать код аппаратного прерывания в досе я знаю, писал и для сом порта по 7й ноге и для клавиатуры на ассемблере.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Тут сказано что драйвер вызывает колбек из прикладного кода
что такое колбек не понял.

Цитата:
Сообщение от Pavia Посмотреть сообщение
Но тут есть ещё вторая проблема. Прерывание может появиться когда угодно и где угодно.
проблема не только в этом, а в том что прерывание длится несколько микросекунд и по идее оно должно где то зафиксироваться/задублироваться, я так понимаю что в регистре FIFO, а уже признак наличия прерывания в ФИФО в этой микросхеме идет как отдельное прерывание 15 разряда регистра вектора прерывания в этой микросхеме и возможно где то то еще может дублироваться флагом, что то похожее было в описании на программу

Цитата:
Сообщение от Pavia Посмотреть сообщение
Хотя надо знать что за МК
почему то на плате наименование этой микросхемы заклеено, написано только что это микросхема Actel, не знаю даже где посмотреть, правда по этой тематике есть форум у разработчика микросхем интерфейсных плат на базе стандарта MIL STD 1553B, но там почему то не проходит регистрация, поэтому несколько дней уже топчусть на месте и не могу разобраться как работает аппаратное прерывание.

Последний раз редактировалось Аватар; 04.05.2017 в 11:24.
седьмой вне форума   Ответить с цитированием
Старый 04.05.2017, 10:53   #6
digitalis
Профессионал
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Адрес: Минск
Сообщений: 1,563
Репутация: 549
По умолчанию

Ой, какой кошмар - столько сообщений подряд! На radiokot.ru за это уже получил бы ата-та по попе.
Насчет Acte - я с ними не работал, потому не утверждаю, что это - не МК, узнал вот по источникам, что Actel специализируется на ПЛИС, но на ПЛИС можно сообразить что угодно, в т.ч. и МК с системой команд, заточенной под конкретную задачу. Так что оно может быть и ПЛИС, и МК одновременно.
digitalis вне форума   Ответить с цитированием
Старый 04.05.2017, 11:36   #7
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Адрес: Киров
Сообщений: 140
Репутация: 10
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Ой, какой кошмар - столько сообщений подряд! На radiokot.ru за это уже получил бы ата-та по попе.
А как надо??? Я исправлюсь не бейте!
Цитата:
Так что оно может быть и ПЛИС, и МК одновременно.
дело ясное, что дело темное?
седьмой вне форума   Ответить с цитированием
Старый 04.05.2017, 11:54   #8
digitalis
Профессионал
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Адрес: Минск
Сообщений: 1,563
Репутация: 549
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
А как надо??? Я исправлюсь не бейте!
Я - не мордератор, бить не уполномочен. Обычно если ответ на короткую реплику и сразу, то можно не цитировать, а если на большое сообщение отвечаем по частям, то выделяем в сообщении первый тезис - отвечаем, второй - отвечаем и т.д. Например:
Цитата:
Чижик-пыжик, где ты был?
На Фонтанке водку пил.
Цитата:
Выпил рюмку?
Выпил две !

Последний раз редактировалось digitalis; 04.05.2017 в 11:56.
digitalis вне форума   Ответить с цитированием
Старый 04.05.2017, 12:08   #9
Pavia
Лис
Профессионал
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 1,816
Репутация: 1956
По умолчанию

Вообще-то там на документацию написан что у вас стоит АРА150-PQ208.
Это ПЛИС! Там либо прошивка с микроконтроллером либо с автоматом. Ранее ПЛИС принадлежала Actel пока их не купил Microsemi.

Цитата:
Спасибо за ответ, вы очень расширенно ответили на вопрос, очень приятно читать, но понятно далеко не все, вот в этом вы кажется не правы, так как в данной инструкции на 8й
Это вы можете рассматривать как ещё один контроллер прерываний. Получается цепочка из контроллеров прерываний.
Тут просто внутри вашей платы ещё ряд прерываний. А проводов прерываний у PCI платы всего 4, но используется только 1. Вот что-бы запихать все прерывания в одну линию используется регистр РВП. Обработчик драйвера проверяет какое это прерывания и выполняет нужные действия.
На самом деле там сложнее так как у вас мультиплексор. Поэтому у них там ещё организована очередь прерываний(FIFO прерываний).
__________________
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума   Ответить с цитированием
Старый 04.05.2017, 15:15   #10
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Адрес: Киров
Сообщений: 140
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Поэтому у них там ещё организована очередь прерываний(FIFO прерываний)
Но ведь ФИФО я думаю подразумевает 1й пришел, 1й вышел, те нужное мне прерывание как аппаратное работать уже не будет? (там же нет возможности чтения конкретного прерывания как в векторе прерываний в досе) ? Мне придется прочитать в Фифо все данные, прежде чем понять, есть там мое прерывание или нет? Допустим меня интересует прерывание поступления данных из КК в ОУ. Если буфер Фифо 256 байт, тактовая частота процессора 180мгц, или 0,005мкс, пусть 1 байт считывается за 10 тактов процессора, это займет 0,05 мкс, до последнего прерывания я доберусь через 10 мкс, ну наверно такое прерывание можно назвать аппаратным. Следовательно нужно искать в драйвере, по логике, функцию этого одного прерывания от платы? (Я понимаю, что обратился к вам не по адресу, мне нужно на другой форум, более близкий к теме, но сроки поджимают, а на тот форум не могу попасть) (Мне еще повезло, что вы отвечаете, а то на киберфоруме сразу забрасывают гнилыми помидорами вместо ответов, повторяя одно и тоже, что дос умер 20 лет назад)
Цитата:
Сообщение от Pavia Посмотреть сообщение
но используется только 1
это какое одно вы имели в виду?
И спасибо за APA150-PQ208, я это не нашел...

Ну все нашлись добрые люди, подсказали, показали, научили. Оказалось прерывание у платы PCI можно посмотреть программой sisinfo , прерывание IRQ11 INTA#. Тему наверно можно закрыть.

Последний раз редактировалось седьмой; 04.05.2017 в 17:41.
седьмой вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают прерывания xotonic Assembler 4 24.10.2014 21:18
скрипты для OlliDbg- как они пишутся и как работают Dimka-novitsek Assembler 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 14:13


23:33.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru