Прерывания в AVR

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315470#p3315470"]это самое начало кода (ассемблер и прошивка на языке МК): сначала (h00) ссылка на начало исполнимого кода(reset), потом ссылки на начала подпрограмм прерываний (h02 - int0, h04 - int1 и т.д....) эти ссылки стоят здесь жестко (при компиляции меняется записанный в них вектор) т.е при вызове инт0 контроллер прыгнет на 2е слово (1слово = 2 байта) прошивки (это железно в нём заложено) и прочитает там команду перехода на обработчик прерывания.
распишу по кодевижну (думаю в других С компиляторах ненамного отличается): гдето недалеко от исполнимого файла есть папка "inc" в ней файлы по названиям микросхем, в них адреса перевода битов, регистров, переходов... для перевода с человеческого языка на машинный цифровой, покопайся, может станет понятней (только не меняй ничего), а ещё можно почитать книги, (наверно лучше или про устройство МК или по ассемблеру - он к железу ближе), (конкретных не посоветую, но думаю, сейчас коты помогут).
пс: тот кусок, что я приводил - это перевод из С в ассемблер (а потом уже он превращается в прошивку) - если открыть этот файл целиком, то можно увидеть, насколько много скрыто от С программиста :)[/uquote]

когда мы прописываем обработчик компилятор его помещает куда считает нужным, но ссылку закидывает получается по адресу вектора прерывания для INT0 $002 простым языком по адресу вектора прерывания хранится ссылка на обработчик так чтоли? так же в принципе можно и вручную закинуть ссылку какой-нибудь функции по адресу вектора прерывания и не прописывать обработчик...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

в ассемблере, наверно, даст, а вот как в С это сделать я не знаю.
кстати не ссылка, а команда перехода, ассемблерщики иногда туда RETI вписывают и получается сразу выход обратно в исходную программу, или вписывают переход на подпрограмму вывода ошибки (чтобы зафиксировать неправильный переход).

Добавлено after 2 minutes 28 seconds:
только полезность сих манипуляций в готовом изделии сомнительна (т.к. этих переходов не должно быть впринципе, и добиться этого не сложно - достаточно не накосячить с масками прерываний)

Добавлено after 1 minute 57 seconds:
ROMan2947 писал(а):в принципе можно и вручную закинуть ссылку какой-нибудь функции по адресу вектора прерывания и не прописывать обработчик...
:))) :))) :))) так эта функция и станет обработчиком

Добавлено after 28 minutes 37 seconds:
а вообще туда можно любую команду вставить, она будет выполнена, счетчик команд инкрементируется и АЛУ приступит к выполнению следующей команды (той, что отвечает за следующее прерывание)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Грызет канифоль
Аватара пользователя
Сообщения: 287
Зарегистрирован: Сб янв 23, 2016 00:59:59
Откуда: Чебоксары

Сообщение ROMan2947 »

так эта функция и станет обработчиком
в моем понимании обработчик это ISR(INTn_vect) я ошибаюсь?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

если рассматривать всё это взглядом ассемблерщика (а ассемблер к железу всётаки ближе) обработчик прерывания и обработчик подпрограммы похожи: и там и там в стек запихивается текущее состояние исполняемой программы, а после завершения извлекается обратно, но при завершении прерывания ещё восстанавливается флаг I. в С они, конечно, не взаимозаменяемы, в С вообще много что упрощено для понимания и скрыто (повторяюсь) от программиста, но, если хочешь понять железо - учи ассемблер, ну или хотябы алгоритмбилдер скачай (там, правда, вопросы прерываний тоже не совсем прозрачны, но поизгаляться хватит :)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315554#p3315554"]...и там и там в стек запихивается текущее состояние исполняемой программы...[/uquote]
На самом деле - только адрес возврата.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315554#p3315554"]...при завершении прерывания ещё восстанавливается флаг I...[/uquote]
Командой RETI.

Добавлено after 2 minutes 33 seconds:
[uquote="ROMan2947",url="/forum/viewtopic.php?p=3315479#p3315479"]...вручную...[/uquote]
Всё, что заблагорассудится.

Добавлено after 2 minutes 31 second:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3315496#p3315496"]...а вообще туда можно любую команду вставить...[/uquote]
и если это команда перехода, то инкремента не будет (ну, если это не команда jmp $+1).
Docendo discimus
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

1) аппаратно адрес возврата, но, часто сами компиляторы дописывают сохранение-восстановление части регистров.
2) ну, да RETI, но на С такого оператора нет... его сам компилятор подставляет при выходе из прерывания. при выходе из подпрограммы используется оператор RET, но в ассемблере никто не запретит их использовать и наоборот (например если при выходе из прерывания I восстанавливать не надо, и, хоть это дурной тон и источник граблей, МК команду поймёт).
4) конечно, о каком инкременте речь, если и так обращение к счетчику команд идет.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

1. чтобы не загружать программиста рутиной. Заметь - именно те регистры, которые используются в данной подпрограмме.
2. С сам определяет что подставить, разгружая программиста. Точно так же никто не запретит программисту сделать так, как ему нужно, а не компилятору.
4. " туда можно любую команду вставить, она будет выполнена, счетчик команд инкрементируется"
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

4) признаю, я имел в виду, что эта область ни чем не отличается от другой области памяти программ и выполняется код, записанный туда, как код, записанный в другом месте, только попасть на исполнение этого кода также можно словив прерывание.
пс. pyzhman, внимание к мелочам, особенно когда у когото его больше чем у тебя, конечно раздражает, но это правильно, и да восторжествует истина! :beer:
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

И да будет мир во всём мире!
Docendo discimus
Контактная информация:
Ответить

Вернуться в «AVR»