Прерывания - 2K тактов это много?

Обсуждаем контроллеры компании Atmel.
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Re: Прерывания - 2K тактов это много?

Сообщение Simon.S »

[uquote="veso74",url="/forum/viewtopic.php?p=4772826#p4772826"]каждая кнопка может иметь свой собственный пин :)[/uquote]

А готовые клавиатуры с таким подключением и красивой лицевой панелью бывают? Я чего-то кроме матричных с красивой лицевой панелью не нашел.

Добавлено after 6 minutes 33 seconds:
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4772780#p4772780"]У меня обычно новая смена состояния допускается не раньше, чем через 50-80мс после предыдущей.
Вот такой простой код.[/uquote]
Спасибо, к выходным посмотрю сейчас голова другим загружена.

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4772780#p4772780"]понятно, что если концевик можно "проскочить", то придется задействовать прерывание, но во всех остальных случаях это не нужно[/uquote]
[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4772780#p4772780"]Заодно и "антидребезг" программный[/uquote]
Появилась идея как использовать прерывание со входа - сразу засчитать нажатие, но игнорировать повторное нажатие этой же кнопки определённое время. Ну и конденсаторы конечно, тут без них плохо будет.
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Прерывания - 2K тактов это много?

Сообщение AQ29 »

[uquote="Simon.S",url="/forum/viewtopic.php?p=4772513#p4772513"]Но теперь, если у меня будет 16 кнопок, то в прерывании задержусь на 1600тактов, плюс, допустим, 400 тактов на всякую другую фигню.[/uquote]
Если у вас 16 кнопок, для их считывания ставьте соответствующую микросхему, например, ТМ1638. Она вроде как может работать с 24 кнопками, да ещё и выводить информацию на семисегментный дисплей (не помню, вроде 10 разрядов). Управляется по SPI.
На чём сейчас пишу, одна простая команда считывания с ТМ1638, есть даже с учётом дребезга, всё банально.
В ЧипДипе ТМ1638 стоит 18 рублей, это мелочь.
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Re: Прерывания - 2K тактов это много?

Сообщение Simon.S »

[uquote="linux_rulezz",url="/forum/viewtopic.php?p=4772780#p4772780"]
(Почти) не использую многозадачность кнопок
Да ведь это несложно сделать в конечном автомате. Кнопка или концевик - штука очень медленная, достаточно опрашивать 1 раз в миллисекунду (понятно, что если концевик можно "проскочить", то придется задействовать прерывание, но во всех остальных случаях это не нужно). Каждой кнопке заводим структуру: предыдущее состояние, нонешнее состояние, время последней смены состояния. Если еще счетчик нажатий ввести, можно и несколько нажатий подряд детектировать (а по прошествии определенного времени сбрасывать в нуль). Заодно и "антидребезг" программный. У меня обычно новая смена состояния допускается не раньше, чем через 50-80мс после предыдущей.
Вот такой простой код.[/uquote]

Тоже интересное решение. Спасибо!

А вообще вариантов появляется намного больше, чем успеваю реализовать. Так я буду делать 1000 + 1 реализацию обработки кнопок, наверное нужно решать проблемы по мере появления.

А то уже количество строк кода для обработки нажатия приближается к 500 (правда вместе с комментариями и дефайнами). А в итоге при самых простых настройках, дают всего 20 строк ассембелернрого кода.
Но правда если включить все опции(долгое нажатие, автосброс неиспользуемых нажатий и т.п.), то ассемблерный код разрастается до почти 100 строк, но при этом в нормальном состоянии из-за условных переходов отработает за несколько тактов.
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Прерывания - 2K тактов это много?

Сообщение veso74 »

[uquote="Simon.S",url="/forum/viewtopic.php?p=4773906#p4773906"]... А вообще вариантов появляется намного больше, чем успеваю реализовать ...[/uquote]
Вчерашняя установка: нужно было портировать программный код с ARM (48 MHz) на PIC (внурт. 4 MHz -> /4 = клок 1 MHz) (для управления устройством, сигналы в областью x1..x10 μs). В рабочем коде возникали большие непредсказуемые паузы, пришлось полностью переработать вычислительную часть (битовые операции, сдвиг и т. д.). А на ARM код работает без всяких условий, со временем вообще не думал об оптимизации, напр. в отношении количества инструкций).

Так что пусть будут варианты решения, через некоторое время вспомните, что уже тестировали другие методы/способы, и быстро их примените :).
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Прерывания - 2K тактов это много?

Сообщение AQ29 »

[uquote="Simon.S",url="/forum/viewtopic.php?p=4772513#p4772513"]P.P.S. Если можно подскажите на сколько в норме можно занимать прерывание в тактах или в миллисекундах в условиях когда в других прерываниях нет ничего важного и в условиях когда что-то есть. Желательно с конкретными примерами - например если используется UART на скорости 19200, то не больше столько-то.

А то уже количество строк кода для обработки нажатия приближается к 500 (правда вместе с комментариями и дефайнами).[/uquote]
В прерываниях предпочитаю только необходимый минимум, десяток, другой ассемблерных команд. Остальная обработка – в основной программе. Это избавляет от ряда проблем.
Иногда можно вообще не прыгать в прерывания, а работать по аппаратному флагу прерывания.
Часто опрос кнопок можно делать в основном круге вообще без прерывания, это проще.
Прямой связи со скоростью UART нет, всё зависит от построения программы.
Для такой простой задачи 500 строк – это ужас. Наверно, у вас пройдёт простой вариант, на основном круге в свободном окне делать опрос кнопок с учётом дребезга. Спецы критикуют, но очень просто и надёжно.
u37
Сверлит текстолит когтями
Сообщения: 1196
Зарегистрирован: Пн май 01, 2017 20:01:45

Re: Прерывания - 2K тактов это много?

Сообщение u37 »

Вообще-то, 2к инструкций при 20М даст время 0.1 мс. За две страницы не смогли этого вычислить.
Что такое 0.1 мс в прерывании (с отсутствием приоритетного арбитража)? При отсутствии DMA это означает отказ работы при приеме длины двух символов. Т.е. 19200+ это гарантированный сбой приема. Если устройство живет не на 2400-9600, что никто ставить не будет, то сие "плоскостопие" означает полный черный ящик с веревочками - внешние интерфейсы невозможны.
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Re: Прерывания - 2K тактов это много?

Сообщение Simon.S »

Вот кстати код обработчика кнопок:
https://github.com/SimonLitt/sls-avr-li ... r/button.h
https://github.com/SimonLitt/sls-avr-li ... r/button.c

Код: Выделить всё


void init_buttons(void) {
	PIN_TO_READ(BTN_HI_PORT, BTN_HI_PIN);
	PIN_TO_READ(BTN_LO_PORT, BTN_LO_PIN);
}

void buttons_loop(volatile compare_clock_t *const compare) {
	static btn_info_t hi_btn_info = BTN_INFO_STRUCT_DEFAULT;
	static btn_info_t lo_btn_info = BTN_INFO_STRUCT_DEFAULT;

	btn_proc(&hi_btn_info, !(PIN_READ(BTN_HI_PORT, BTN_HI_PIN)));
	btn_proc(&lo_btn_info, !(PIN_READ(BTN_LO_PORT, BTN_LO_PIN)));

	if (btn_is_holded(lo_btn_info.state) && btn_is_clicked(hi_btn_info.state)) {
		on_two_buttons();
		btn_reset(&hi_btn_info);
		btn_set_processed(lo_btn_info.state); // Wait up.
		lo_btn_info.state = BTN_INFO_STATE_DEFAULT; // Prevent action.
	} else if (btn_is_clicked(lo_btn_info.state)) {
		on_lo_click();
		btn_reset(&lo_btn_info);
	} else if (btn_is_long_clicked(lo_btn_info.state)) {
		on_lo_press();
		btn_reset(&lo_btn_info);
	}

	if (btn_is_clicked(hi_btn_info.state)) {
		on_hi_click();
		btn_reset(&hi_btn_info);
	} else if (btn_is_long_clicked(hi_btn_info.state)) {
		on_hi_press();
		btn_reset(&hi_btn_info);
	}
	clock_compare_incr_fegi(compare, BTN_LOOP_STEPS_OF_CLOCK);
}

И всё это крутится вне прерывания в основном цикле (естественно не каждый раз, а раз в 10ms).
До нормального кода клавиатуры(который не стыдно было бы показать) руки так и не дошли, пока только наброски.
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Прерывания - 2K тактов это много?

Сообщение AQ29 »

[uquote="u37",url="/forum/viewtopic.php?p=4776803#p4776803"]Вообще-то, 2к инструкций при 20М даст время 0.1 мс. За две страницы не смогли этого вычислить.
Что такое 0.1 мс в прерывании (с отсутствием приоритетного арбитража)? При отсутствии DMA это означает отказ работы при приеме длины двух символов. Т.е. 19200+ это гарантированный сбой приема. Если устройство живет не на 2400-9600, что никто ставить не будет, то сие "плоскостопие" означает полный черный ящик с веревочками - внешние интерфейсы невозможны.[/uquote]
Пару байтов не принять, гарантируемый сбой, внешние интерфейсы невозможны – какой-то у вас всё сильно проблематично.
Для многих задач подойдёт простой метод: в основном круге по установившемуся флагу прерывания USART (например, от компьютера) перейти на программу связи через USART и провести связь.
Здесь всё просто, скорость USART не важна, принять можно и пару байт, и пару сотен, и пару килобайт, DMA не нужен.
Конечно, есть специфика задачи.

Simon.S
Вы писали на ассемблере, а тут вроде как СИ. СИ для меня замороченный язык.
На современном ассемблере строчек, пожалуй, поменьше будет и читаемость лучше.
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Re: Прерывания - 2K тактов это много?

Сообщение Simon.S »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777246#p4777246"]Вы писали на ассемблере, а тут вроде как СИ.[/uquote]
Нет, на С. Просто анализировал что выводит компилятор с опцией `-S`

[uquote="AQ29",url="/forum/viewtopic.php?p=4777246#p4777246"]СИ для меня замороченный язык.[/uquote]
На вкус и цвет, как говорится...
Для меня ассемблер замороченный. Не скажу, что совсем тёмный лес, просто смысла в нём особого не вижу. Пока ни разу в жизни не пригодился, даже когда работал разработчиком.
Для души конечно интересно - померяться у кого код, меньше и быстрее. Меня поэтому MCU и привлекают, я С понял только тогда, когда начал разрабатывать под AVR.
Но каждому своё - кого-то и ардуино устраивает, а я такого вынести не могу :twisted:

Добавлено after 2 minutes 9 seconds:
Для меня самая большая проблема придумать проект, который я не смогу купить быстрее и дешевле, чем самому разработать. Вроде почти всё уже придумали. Поэтому больше экспериментирую, чем реально что-то делаю.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Прерывания - 2K тактов это много?

Сообщение КРАМ »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777246#p4777246"]На современном ассемблере .... читаемость лучше.[/uquote]
Штаааа????!!!!1111 :music: :music: :music:
Ничего глупее придумать не могли?
Весь смысл языков высокого уровня - это управление сложностью кода. Что собственно становится возможным именно благодаря высокой читабельности кода. В отличии от ассемблера.
Вы просто не знаете ЯВУ. Поэтому и пишите всякую чушь.
ЗЫ. Для определенности. Не нужно приводить код автора темы в качестве примера "замороченности". Это точно НЕ референс. :)
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Re: Прерывания - 2K тактов это много?

Сообщение Simon.S »

В фирме, где я первый раз устроился на работу говорили, что железо стоит дешевле, чем работа программиста. Я до сих пор согласен с этим утверждением.
Но, как уже писал, MCU нравится именно сложностью - ограниченные ресурсы, да и много чего вспомнить пришлось, что во время учебы, не особо воспринималось.

Добавлено after 3 minutes 50 seconds:
А соответственно и лучше понять.
Я вообще СИ освоил после школьного Паскаля - писал, писал код на Делфи, а потом понял, что пишу почти на чистом WinAPI(стандартные формы, меня соответственно не устраивали). Когда понял, за день перешёл на СИ, но ещё долго вникал в тонкости.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Прерывания - 2K тактов это много?

Сообщение КРАМ »

[uquote="Simon.S",url="/forum/viewtopic.php?p=4777432#p4777432"]Когда понял, за день перешёл на СИ, но ещё долго вникал в тонкости.[/uquote]
Судя по приведенному коду опроса кнопок - не слишком вникли... :)
Сплошной ковровый if-else... :facepalm:
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Прерывания - 2K тактов это много?

Сообщение AQ29 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4777334#p4777334"][uquote="AQ29",url="/forum/viewtopic.php?p=4777246#p4777246"]На современном ассемблере .... читаемость лучше.[/uquote]
Штаааа????!!!!1111 :music: :music: :music:
Ничего глупее придумать не могли?
Весь смысл языков высокого уровня - это управление сложностью кода. Что собственно становится возможным именно благодаря высокой читабельности кода. В отличии от ассемблера.
Вы просто не знаете ЯВУ. Поэтому и пишите всякую чушь.[/uquote]
Я пишу про условно названный современным ассемблер. В нём встроены элементы ЯВУ, это сильно упрощает разработку.
Например, в основном круге опрос пары кнопок (Start и Stop) можно сделать таким:
Key_Read
If Keys = Key_Start Then Goto L_0
If Keys = Key_Stop Then Goto L_ 1
Встроенная команда Key_Read три раза с заданным интервалом читает порт до тех пор, когда данные отсчёты совпадут, это защита от дребезга. Результат – в регистре Keys.
Key_Start и Key_Stop – числа, соответствующие нажатой кнопке.
Далее обработка нажатой кнопки Start, ожидание отпускания кнопки:
L_0:
Key_Read
If Keys <> 0 Then Goto L_ 0
……
Немного упростил для читаемости.
Этого языка вы не знаете, но, наверно, и так всё понятно.
Писать просто, читаемость хорошая, даже комментарии не нужны, 6 простеньких строчек. Можете сравнить с СИ.
Правда, при таком опросе программа задержится на опросе кнопок, но в большинстве случаев это несущественно.
Если нужно определить длительное и короткое нажатие, можно запустить таймер. Если фиксированное время основного круга, наверно, можно обойтись без таймера.
500 строк у ТС для такой простой задачи шокировали.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19039
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Прерывания - 2K тактов это много?

Сообщение Starichok51 »

AQ29 писал(а):Этого языка вы не знаете
видимо потому, что это его ты изобрел.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Прерывания - 2K тактов это много?

Сообщение КРАМ »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777731#p4777731"]Например, в основном круге опрос пары кнопок (Start и Stop) можно сделать таким:
Key_Read
If Keys = Key_Start Then Goto L_0
If Keys = Key_Stop Then Goto L_ 1.[/uquote]
Называть это "читабельным" - бред сивой кобылы. :facepalm:
Спорить о вкусе устриц нужно с теми, кто их ел... (с)
Сначала хотя бы ознакомьтесь с Си, а потом пытайтесь оценить "читабельность".
AQ29
Нашел транзистор. Понюхал.
Сообщения: 198
Зарегистрирован: Сб июл 30, 2011 21:00:24

Re: Прерывания - 2K тактов это много?

Сообщение AQ29 »

КРАМ
Этот «бред сивой кобылы» неплохо работает, а время написания – минуты.
Насчёт читабельности. Интересно, какие у вас затруднение возникли при чтении этих команд, что непонятного.
На мой взгляд, это совсем простые строки.
Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Прерывания - 2K тактов это много?

Сообщение КРАМ »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777962#p4777962"]Этот «бред сивой кобылы» неплохо работает, а время написания – минуты.[/uquote]
Это зависит от сложности алгоритма. Помигать LED-ом или прочитать клаву - это суперпримитивные задачи.
Макросы АСМа - это беспонтовый костыль. Чисто листинг сократить.
[uquote="AQ29",url="/forum/viewtopic.php?p=4777962#p4777962"]Насчёт читабельности. Интересно, какие у вас затруднение возникли при чтении этих команд, что непонятного.
На мой взгляд, это совсем простые строки.[/uquote]
В том и дело, что простые. Текст понятен до уровня его исполнения. Алгоритм в нем вообще не читается.
А под читабельностью понимается не код, а алгоритм.
[uquote="AQ29",url="/forum/viewtopic.php?p=4777962#p4777962"]Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.[/uquote]
[uquote="AQ29",url="/forum/viewtopic.php?p=4777246#p4777246"]На современном ассемблере строчек, пожалуй, поменьше будет и читаемость лучше.[/uquote]
:facepalm: Феерично. Си не знает, но точно знает, что читаемость на ассемблере будет лучше...
:music: :music: :music:
Последний раз редактировалось КРАМ Ср янв 07, 2026 11:06:28, всего редактировалось 1 раз.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: Прерывания - 2K тактов это много?

Сообщение Adrift »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777962#p4777962"]Насчёт СИ. Изучишь СИ, а он окажется хуже, впустую потрачено время.[/uquote]
Сколько лет вы уже на свой современный ассемблер потратили? И не потому ли никому его не показываете, что вдруг именно он окажется хуже? )
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Прерывания - 2K тактов это много?

Сообщение КРАМ »

[uquote="AQ29",url="/forum/viewtopic.php?p=4777731#p4777731"]Встроенная команда Key_Read три раза с заданным интервалом читает порт до тех пор, когда данные отсчёты совпадут, это защита от дребезга. Результат – в регистре Keys.
Key_Start и Key_Stop – числа, соответствующие нажатой кнопке.[/uquote]
В догон.
Во первых, уже обсуждали как выглядит защита от дребезга. "Читать три раза подряд с заданным интервалом" - совершенно пустое мероприятие. Мало того, оно еще и блокирующее или требует специально выделенного таймера.
Во вторых, кнопки могут висеть на разных портах и все "числа соответствующие данной нажатой кнопке" идут попесдэ лесом и болотами...
В третьих, AVR является RISC машиной, то есть вся математика возможна только с РОНами. А это значит, что регистр Keys - это РОН. Со всеми вытекающими последствиями для остального кода и его читабельности. :music:
ЗЫ.
Штобтызнал.
Вот так выглядит функция подсчета CRC16 на Си. Абсолютно для любого контроллера любой разрядности.

Код: Выделить всё

uint16_t crc16_x25(uint8_t* data, uint16_t len)
{	
	#define CRC16_START_VALUE		0xFFFF
	#define POLINOM		0x8408
    
	uint16_t i;
	uint8_t k;
	uint16_t crc=CRC16_START_VALUE;
	
  for (i=0;i<len;i++)
	{
    crc^=data[i];
    for (k=0;k<8;k++)
			if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1;
  }
  return ~crc;
}
Эта функция не зависит от вызываемого ее кода. То есть может работать с любыми разными исходными массивами программы.
Транслируется для 32-битного ARM так (оптимизация о3):

Код: Выделить всё

    49: {        
    50:         #define CRC16_START_VALUE              0xFFFF 
    51:         #define POLINOM  0x8408 
    52:      
    53:         uint16_t i; 
    54:         uint8_t k; 
0x08002C48 B570      PUSH          {r4-r6,lr}
    55:         uint16_t crc=CRC16_START_VALUE; 
    56:          
0x08002C4A F64F72FF  MOVW          r2,#0xFFFF
    57:   for (i=0;i<len;i++) 
    58:         { 
0x08002C4E 2300      MOVS          r3,#0x00
0x08002C50 F2484508  MOVW          r5,#0x8408
0x08002C54 E00E      B             0x08002C74
    59:     crc^=data[i]; 
0x08002C56 5CC4      LDRB          r4,[r0,r3]
0x08002C58 4062      EORS          r2,r2,r4
    60:     for (k=0;k<8;k++) 
0x08002C5A 2400      MOVS          r4,#0x00
    61:                         if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1; 
    62:   } 
0x08002C5C 07D6      LSLS          r6,r2,#31
0x08002C5E D002      BEQ           0x08002C66
0x08002C60 EA850252  EOR           r2,r5,r2,LSR #1
0x08002C64 E000      B             0x08002C68
0x08002C66 0852      LSRS          r2,r2,#1
0x08002C68 1C64      ADDS          r4,r4,#1
0x08002C6A B2E4      UXTB          r4,r4
0x08002C6C 2C08      CMP           r4,#0x08
0x08002C6E D3F5      BCC           0x08002C5C
0x08002C70 1C5B      ADDS          r3,r3,#1
    57:   for (i=0;i<len;i++) 
    58:         { 
    59:     crc^=data[i]; 
    60:     for (k=0;k<8;k++) 
    61:                         if((crc&0x1)!=0) crc=(crc>>1)^POLINOM; else crc=crc>>1; 
    62:   } 
0x08002C72 B29B      UXTH          r3,r3
0x08002C74 428B      CMP           r3,r1
0x08002C76 D3EE      BCC           0x08002C56
    63:   return ~crc; 
0x08002C78 43D0      MVNS          r0,r2
0x08002C7A B280      UXTH          r0,r0
    64: } 
0x08002C7C BD70      POP           {r4-r6,pc}
0x08002C7E 0000      MOVS          r0,r0
   308: { 
Последний раз редактировалось КРАМ Ср янв 07, 2026 12:33:28, всего редактировалось 1 раз.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15545
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Прерывания - 2K тактов это много?

Сообщение BOB51 »

ГЫММ....
А как, к примеру, на СИ будет выглядеть типичный для ассемблера приём условного возврата из прерывания подстановкой адреса возврата в стеке?
Т. Е.
Прерывание:
Загрузить в стек адрес перехода к обслуживаемых программе, которая завершается по RET
И выполнить стандартное для прерывания RETI
Далее программа прыгает на "длинный обработчик" при разрешённых прерываниях. По завершении того "длинного обработчика" происходит возврат на предшествовавший прерывания участок основной программы.
:roll:
Ответить

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