Можно ли выйти из прерывания не по reti ?

Обсуждаем контроллеры компании Atmel.
Ответить
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Хочется, чтобы после события начинал исполняться другой кусок программы, а не тот из которого вышли в прерывание.
Боже мой, и никто не сказал, что всего-то надо заменить адрес возврата в стеке на желаемый и выйти тем же reti. :)

Но вообще да, для переключения режимов лучше использовать конечный автомат.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

akl, спасибо, тут это действительно написано. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

А где мне спасибо? :)))
Fucking static initialization order fiasco
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Вам можно сказать спасибо за первоначальную мысль. :) Вы же не с компьютера писали, вот и не смогли опередить akl. :) А вот за утверждение чего-то с отправкой в гугл искать доказательства того, что вы утверждаете спасибо не говорят. :) А akl как раз привёл фрагмент документации, где всё чётко написано. За это я ему спасибо и сказал. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Miw
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Пн ноя 24, 2014 16:58:41

Сообщение Miw »

da-nie писал(а):
то бишь каждая команда выполняется как отдельная функция и длится 10 секунд * каунтер.
А что мешает внутри каждой команды проверять кнопки и выходить наружу?
Так функций много будет, их уже 4 и потом уверен, что придумаю новые.
В каждой городить огород тоже не очень

COKPOWEHEU писал(а):Или сделать для каждого эффекта конечный автомат. Вот пример для более многоногого контроллера, демонстрация принципа.
Да, пример отличный, логика понятна
На самом деле, это ничем не отличается от обработки нажатий в каждой функции, или я чего-то не понял?
придумал новые детальки : оптимистор и пессимистор ...
осталось придумать для чего они нужны ))))
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Так функций много будет, их уже 4 и потом уверен, что придумаю новые.
Так берите их и копируйте общую часть. Или вставьте её в отдельную функцию обработки кнопок, а в рабочей функции просто анализируйте, пора выходить или нет. 8)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

da-nie писал(а): А вот за утверждение чего-то с отправкой в гугл искать доказательства того, что вы утверждаете спасибо не говорят.
А, ну да. Вам подскажи, где копать, потом выкопай за Вас. Потом принеси, в рот положи. Логика понятна. :beer:
Fucking static initialization order fiasco
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

На счет разницы между мегой8 и тини13 никто не сказал, что тинька не имеет аппаратного умножителя и еще ряда команд.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Miw писал(а):Да, пример отличный, логика понятна
На самом деле, это ничем не отличается от обработки нажатий в каждой функции, или я чего-то не понял?
Не отличается результат, а вот сам принцип позволяет добавлять куски кода, выполняющиеся "параллельно" с другими, правда если они будут сильно нелинейными по времени (занимать разное время при разных условиях) стоит озаботиться синхронизацией по таймеру.
Например, захочется выводить номер режима на семисегментник, да еще динамической индикацией, или звуки какие. Хотя это лучше по таймеру делать, но и так возможно. Или, скажем, переключаться в зависимости от результата АЦП, мало ли применений.
ARV писал(а):На счет разницы между мегой8 и тини13 никто не сказал, что тинька не имеет аппаратного умножителя и еще ряда команд.
У них столько отличий, что отсутствие аппаратного умножения выглядит не существеннее отсутствия UART'а или нескольких таймеров.
Прорезались зубы
Аватара пользователя
Сообщения: 211
Зарегистрирован: Пт июл 31, 2009 19:45:11
Откуда: Санкт-Петербург

Сообщение Deer »

Miw писал(а):Собственно вопрос - можно ли уйти из прерывания по rjmp ? Как нужно почистить стек ?
Подсуньте инструкции RETI нужный адрес возврата, и будет Вам счастье!

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

; Непосредственно перед RETI:
POP R16
POP R16
LDI R16, High ( Label_Where_to_Jump )
PUSH R16
LDI R16, Low (Label_Where_to_Jump)
PUSH R16
[b]RETI[/b]

; Мог перепутать порядок младшей и старшней половин адреса, но это легко проверить и поправить
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

А, ну да. Вам подскажи, где копать, потом выкопай за Вас. Потом принеси, в рот положи. Логика понятна.
Кто утверждает, тот и доказывает. ;) Это первое.
Кроме того, вы в своём посте сообщали информацию или самоутверждались? ;) Вот когда самоутверждаются, тогда, обычно, не стремятся объяснять что, как и почему. Типа, сами найдёте, о чём я говорю. А вот когда хотят показать что-то, тогда приводят ссылки, документацию, объясняют что да как. :) А если же не могут привести эти данные, то сообщают об этом. Это правила хорошего тона.
Подсуньте инструкции RETI нужный адрес возврата, и будет Вам счастье!
Боже, не надо этого делать! :shock: Я за 20 лет написания программ, большего извращения, чем прыгать из прерывания куда угодно, не видел. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

YS писал(а):Боже мой, и никто не сказал, что всего-то надо заменить адрес возврата в стеке на желаемый и выйти тем же reti. :)
Deer писал(а):Подсуньте инструкции RETI нужный адрес возврата, и будет Вам счастье!
А в чем преимущество перед простым прыжком?
da-nie писал(а):Боже, не надо этого делать! :shock: Я за 20 лет написания программ, большего извращения, чем прыгать из прерывания куда угодно, не видел. :)
Когда делал модель операционной системы с вытесняющей многозадачностью так и поступал - адрес прерываемного процесса сохраняется в стеке, затем указатель стека меняется на новый процесс и загружается его адрес.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

Когда делал модель операционной системы с вытесняющей многозадачностью так и поступал - адрес прерываемного процесса сохраняется в стеке, затем указатель стека меняется на новый процесс и загружается его адрес.
Правильно, вы фактически контексты процессов переключали. Но вы всегда возвращались к прерванному процессу - вы просто давали им работать по-очереди. А здесь такого не будет. Здесь прерванная функция никогда более не вернётся в точку прерывания.
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

А в чем преимущество перед простым прыжком?
Не портится стек, автоматически обрабатываются флаги статуса. При простом прыжке в стеке повиснет контекст прерванного процесса и, как следствие, станет неверным указатель стека.
Здесь прерванная функция никогда более не вернётся в точку прерывания.
У-у-у, не факт. :)

Но вообще да, игры с адресами возврата - запутанное дело, к которому надо подходить предельно аккуратно, чтобы не попортить память и логику программы. Если цель - просто менять логику работы в зависимости от внешних воздействий, то здесь самое милое дело - конечный автомат. Я так навскидку даже не могу сказать, где может быть нужно вот так брутально колупать стек, кроме ядра ОС.
Последний раз редактировалось YS Вс дек 21, 2014 16:12:39, всего редактировалось 1 раз.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

У-у-у, не факт.
:))) Не, ну вероятность этого есть, но такая маленькая. :)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

YS писал(а):Не портится стек, автоматически обрабатываются флаги статуса. При простом прыжке в стеке повиснет контекст прерванного процесса и, как следствие, станет неверным указатель стека
Я же приводил кусок кода с очисткой стека и восстановлением флага прерываний. А чему там еще портиться?
Но вообще да, игры с адресами возврата - запутанное дело, к которому надо подходить предельно аккуратно, чтобы не попортить память и логику программы. Если цель - просто менять логику работы в зависимости от внешних воздействий, то здесь самое милое дело - конечный автомат. Я так навскидку даже не могу сказать, где может быть нужно вот так брутально колупать стек, кроме ядра ОС.
Придумать применений можно много, вот только насколько часто они оправданы? А то могу предложить найти применение еще одному извращению - выбору одного из нескольких вариантов одного прерывания

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

.org 0x0000
rjmp RESET
.org 0x0001
ijmp
Оно использует регистр Z (соответственно, менять его при разрешенных прерываниях нельзя), зато выигрыш в пару тактов перед человеческим методом

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

.org 0x0000
  rjmp RESET
.org 0x0001
  rjmp ANY_INT
...
ANY_INT:
 push r16
 in r16,SREG
 cpi flag,0
   brne ANY_INT_1
 rjmp INT_1
ANY_INT_1:
 cpi flag,1
    brne ANY_INT_2
 rjmp INT_2
 out SREG,r16
 pop r16
reti

INT_1:
...
 out SREG,r16
 pop r16
reti
Хотя, пожалуй, это несколько не в тему.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Я же приводил кусок кода с очисткой стека и восстановлением флага прерываний. А чему там еще портиться?
Не, ну все можно поправить, конечно. Но тогда этим специально надо заниматься. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Miw
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Пн ноя 24, 2014 16:58:41

Сообщение Miw »

Так, хорошо, делаем вот такой алгоритм

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

Main_loop:
	if Button1_Pressed      - next эффект
	if Button2_Pressed      - запрет автоматических переключючений эффекта
	if Button1_Hold	        - запрещаем мигание (нечетные эффекты). То бишь next эффект если надо
	if Button2_Hold         - rjmp Reset
	if Timer на один эффект - next эффект

	switch (по эффекту)
		rcall эффект1
		rcall эффект2	
		...
rjmp Main_loop
Поскольку Тинька у меня всего лишь 13, то и эффекты програмные.
Собственно вопрос пока остается - если rcall эффект1 занимает 5 секунд,
то значит по нажатию кнопки 5 секунд ничего и не будет происходить. Верно ? :cry:
придумал новые детальки : оптимистор и пессимистор ...
осталось придумать для чего они нужны ))))
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

YS писал(а):Не, ну все можно поправить, конечно. Но тогда этим специально надо заниматься. :)
По размеру кода и скорости это не хуже, чем запись в стек и reti.
Miw писал(а):Так, хорошо, делаем вот такой алгоритм
...
то значит по нажатию кнопки 5 секунд ничего и не будет происходить. Верно ? :cry:
Зависит от реализации эффектов. Если каждый эффект зацикливается на 5 сек - да, если выходит после каждого кадра - нет.
P.S. Хорошая смесь Си и ассемблера.
Miw
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Пн ноя 24, 2014 16:58:41

Сообщение Miw »

Значит буду пытаться уменьшить время на 1 эффект, на обычном мигании и свечении это достаточно просто сделать.
С программным Fade придется локальную для функции переменную яркости выносить в главный цикл, но тоже справлюсь )))

Всем большое спасибо за мысли и советы!
И с Наступающим всех!
придумал новые детальки : оптимистор и пессимистор ...
осталось придумать для чего они нужны ))))
Ответить

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