Это вызов подпрограмм, а речь шла об условном возврате с погашением прерывания (или без оного, что много реже). Т. Е. Сначала вход в подпрограмму из исходной точки, затем переход к другому модулю и по его завершении возврат в исходную. Основное назначение - разрешение работы прерываний после исполнения кратковременной части обработчика. При том, что "длинная" часть обработчика прерывания продолжает выполняться до его окончательного завершения как обычная, подпрограмма. Плюс может быть несколько таких "длинных хвостов" согласно необходимым условиям. Собственно одна из разновидностей построения программ... (помимо АВРок и другие семейства существуют - смотрим тот же I8080/Z80, ПИКушки, 51е).
во, к примеру, как у меня сделана подстановка адреса возврата в прерывании для таймера1:
Код:
;--- Таймер1 --- ldi R16, low(RAMEND) out SPL, R16 ldi R16, low(main) push R16 ldi R16, high(main) push R16 reti
перезаписываю вершину стека и пишу в стек адрес возврата.
Баловство. Правильная организация - разбить основной цикл, чтобы с запасом упаковаться в системный тик. 1 мс, 10 мс. Чтобы итерация основного цикла гарантированно с запасом выполнялась за системный тик. А игры со стеком это баловство. В диспетчерах, ртосах ещё пойдет. Не более. Как только настал момент игры со стеком. Значит, ты что то неправильно делаешь в организации программы. Это мое мнение. В свое время я тоже задавался вопросом. А как чё то сделать и вернуться. Потом понял. Это вопрос чайника. Правильная организация программы. Где то валяется самописное диспетчер, ртоска. И там игры со стеком. Не пригодилось
Ну это не только в программировании. Практически во всём и у любого метода есть целесообразность и ограничения.
Тут суть в наличии вариантов решения под конкретные задачи и условия.
Demiurg писал(а):
А игры со стеком это баловство
С позицией хорошо/плохо или добро/зло тоже далеко не уехать))
Нет категории хорошо плохо. Есть единственная целесообразность. И инженерный подход. Постараться учесть все моменты. Чтобы твое устройство не было опасным.
Не так уж и "бесполезный" прием. К примеру "псевдопараллельный" Обработчик динамической индикации/клавиатуры на пребывания от таймера... Вполне жизнеспособной для применения. Да много ещё различных вариантов. Особо для МК без возможности программно изменять приоритет прерываний. Что же касается "абсолютной безопасности/безотказности/надёжности" самоделки - это уже отдельная тема, включающей помимо программной начинки множество других факторов.
Demiurg, это моя программа термометра на DS18B20, и системный тик в ней 1 секунда. прочитал температуру, вывел на экран, запустил преобразование и "топчусь" на месте и жду следующего прерывания. и твоё мнение о "неправильности" не правильное.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Demiurg, в моём случае внешнее прерывание (а оно не циклично) просто останавливает таймер. И после остановки уже нет смысла возвращаться к продолжению, а именно из прерывания нужно сделать прыжок и выполнять совсем другие действия.
Правда пришлось ввести переинициализацию индикатора на max7219 (иногда сбои были) Но повторюсь, в данном случае мне проще сделать прыжок и переписать часть с "чистого листа", чем возвращаться в недоделанное, потом в основной цикл, который забивать проверками флагов и условий.. А программа то всего 0,9 кб ))
shonty, не верный и неправильный подход. Если вы уже подумали прыгнуть со стеком. Это уже неправильный подход. Это хак. Но не решение. Решение осознать проблему и решить её. Без прыжков по стеку. Вывернись наизнанку. Но реши без прыжков. Это будет правильно. Игры со стеком прыжки для диспетчеров и ртос.
Добавлено after 3 minutes 51 second: Поясню. Ты срываешь стек. И ломаешь всю предыдущую работу МК. Да, тебе хочется начать все сначала. А кто тебе мешает? Поставил программный таймер. Не нравится, начинай сначала. Кто мешает?
Returns from subroutine. The return address is loaded from the STACK. The Stack Pointer uses a pre-increment scheme during RET.
Цитата:
Возвращается из подпрограммы. Адрес возврата загружается из СТЕКА. Указатель стека использует схему предварительного приращения во время RET.
или например инструкцию RETI:
Цитата:
Returns from interrupt. The return address is loaded from the STACK and the Global Interrupt Flag is set.
Цитата:
Возврат из прерывания. Адрес возврата загружается из СТЕКА и устанавливается флаг глобального прерывания.
Мы постоянно используем стёк, не ведая об этом и под другим соусом.
Demiurg, кроме как:
Demiurg писал(а):
shonty, не верный и неправильный подход. Если вы уже подумали прыгнуть со стеком. Это уже неправильный подход. Это хак. Но не решение. Решение осознать проблему и решить её. Без прыжков по стеку.
конкретно по коду Starichok51-ка есть что возразить?
Что там "сломалось"?
Добавлено after 1 minute 50 seconds: А пока вы своими сообщениями лишь пытаетесь меня загипнотизировать
Добавлено after 2 minutes 23 seconds: shonty не совсем удачный объект для гипноза)) А вот аргументы с удовольствием почитаю))
в этом моем коде на программный цикл тратится несколько миллисекунд. и потом нужно ждать, когда закончится преобразование в термометре. а время повтора цикла задано таймером с периодом 1 секунда, когда преобразование заведомо закончится. скажу даже больше - я при этом даже не "срываю" стек, он и так уже находится на своей вершине, и операция загрузки вершины стека в моем коде даже лишняя.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Скорее имелось ввиду, что произвольные операции со стеком требуют особого внимания при их организации. Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы. В ЯВУ сие крайне не рекомендованный приём. На сегодня время выполнения команд (быстродействие МК) многие вопросы снимает. Это раньше 1микросекунда на команду ограничения жестко накладывала.
конечно, я бы мог сделать "тупо" по Demiurg-у : создать аппаратный таймер, допустим по 4 мс и потом по программному счетчику ждать 250 прерываний таймера, чтобы получить 1 секунду, и затем перейти на полный цикл. а после окончания цикла вернуться на ожидание 250 прерываний таймера. а игры со стеком опасны только для тех, кто ни хера не понимает в стеке.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Да и делать такие фокусы с достаточной уверенностью можно только под ассемблером, где главный контроль за всеми элементами программы лежит на авторе данной программы.
Вот, кстати, здравая мысль..
Понятно, что программируя на библиотеках, можно уехать на другой адрес и там заблудиться..
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения