Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

Новости об прерываниях

Чт май 04, 2017 08:51:15

Интересная беседа возникла у нас в родственном форуме : http://programmersforum.ru/showthread.php?t=307908. Там Pavia утверждает, что в некоторых МК стек ни к чему, что они могут обрабатывать прерывания вот так :
в некоторых МК есть специальные регистры для обработки прерываний что-бы каждый раз не сохранять их в стеке.
. То ли я не в курсе новых веяний в МК, то ли чел гонит. У меня впечатление - скорее второе.

Re: Новости об прерываниях

Чт май 04, 2017 09:14:43

Jack_A писал(а):что-бы каждый раз не сохранять их в стеке
А кого "их" ?
Например, в "новоиспечённых" PIC'ах, рабочие регистры, типа аккума, статуса и т.д.. сохраняются автоматом и восстанавливаются по выходу из прерывания.
А что за
Jack_A писал(а):специальные регистры для обработки прерываний
тут немного не понятно.

Re: Новости об прерываниях

Чт май 04, 2017 09:36:30

Так и мне непонятно ! Думаю, самому автору ответа Pavia - тоже :(
Варианты могут быть разные. Например, в старых ST62ХХ вообще из программы стек недоступен, он аппаратный: нет программно-доступного указателя стека, но тем не менее туда по прерыванию укладывается PC и PSW, при возврате - извлекается. Иного способа обработки прерываний моя фантазия вообразить не может.

Re: Новости об прерываниях

Чт май 04, 2017 10:19:24

в Холтеках в стэк записывается Program Counter only (HT68F002/HT68F0025/HT68F003)
Stack
This is a special part of the memory which is used to save the contents of the Program Counter
only. The stack is neither part of the data nor part of the program space, and is neither readable nor
writeable. The activated level is indexed by the Stack Pointer, and is neither readable nor writeable.
At a subroutine call or interrupt acknowledge signal, the contents of the Program Counter are pushed
onto the stack. At the end of a subroutine or an interrupt routine, signaled by a return instruction,
RET or RETI, the Program Counter is restored to its previous value from the stack. After a device
reset, the Stack Pointer will point to the top of the stack.

Re: Новости об прерываниях

Чт май 04, 2017 14:00:03

То ли я не в курсе новых веяний в МК, то ли чел гонит. У меня впечатление - скорее второе.
самый верный способ разобраться - это попросить его подтвердить свои слова ссылкой на даташит. и сразу все станет ясно.

Re: Новости об прерываниях

Чт май 04, 2017 15:55:02

Может речь не о том чо стек не нужен, а о том что регистры аппаратно сохраняются?
Из описаания контроллера прерываний ARM CortexM.
Спойлер
Если прерывание инициируется УВВ, то КВВП подключит ЦПУ Cortex к обработке
прерывания. После перехода ЦПУ Cortex в режим прерывания, он помещает набор
регистров в стек. Эта операция выполняется с помощью специального микрокода,
что упрощает прикладной код. В процессе записи данных в стек на шине инструкций
осуществляется выборка начального адреса процедуры обработки прерывания.
Благодаря этому, с момента возникновения прерывания до выполнения первой
инструкции его обработки проходит всего лишь 12 циклов.
К числу помещаемых в стек данных относятся регистр статуса программы, счетчик
программы и регистр связи. Благодаря этому, запоминается состояние, в котором
находилось ЦПУ Cortex CPU. Кроме того, также сохраняются регистры R0 - R3. Эти
регистры широко используются в инструкциях для передачи параметров, поэтому,
помещение в стек делает возможным их использование в процедуре обработке
прерывания. Замыкает список помещаемых в стек регистров - R12. Он выступает в роли
рабочего регистра внутри подпрограммы. Например, если в компиляторе активизировать
проверку стека, то будет генерироваться дополнительный код, который при потребности
в регистре ЦПУ будет использовать R12. По завершении обработки прерывания
все действия выполнятся в обратном порядке: с помощью микрокода извлекается
содержимое стека и, параллельно с этим, осуществляется выборка адреса возврата,
таким образом, для возобновления выполнения фоновой программы потребуется 12
циклов.

Если на обработке находится высокоприоритетное прерывание и, при этом, возникает
низкоприоритетное, КВВП Cortex использует метод непрерывной обработки с
исключением внутренних операций над стеком, который гарантирует минимальность
задержки при переходе к обработке следующего прерывания.
Если возникает два прерывания, первым со стандартной задержкой в 12 циклов
обслуживается прерывание с более высоким приоритетом. Однако, по окончании
его обработки, ЦПУ Cortex не возвращается к выполнению фоновой программы и
содержимое стека не извлекается. Вместо этого, осуществляется выборка адреса
процедуры обработки следующего прерывания с учетом приоритета. Таким образом,
задержка перехода к обработке следующего прерывания составит всего лишь 6 циклов.
По завершении обработки последнего прерывания извлекается содержимое стека и
выполняется выборка адреса возврата. Таким образом, через 12 циклов возобновляется
выполнение фоновой программы.

Re: Новости об прерываниях

Пт май 05, 2017 07:30:07

самый верный способ разобраться - это попросить его подтвердить свои слова ссылкой на даташит. и сразу все станет ясно.

Я предложил ему указать источник - молчит, как рыба об лёд .

Re: Новости об прерываниях

Пт май 05, 2017 13:17:54

Скорее всего имелось ввиду специализированная обработка прерываний аналогичная применяемой в PIC18 - сохранение важной информации от прерывания высшего уровня в специальной области ОЗУ...
:roll:

Re: Новости об прерываниях

Пт май 05, 2017 20:21:13

Я с ПИКами не знаком совершенно, но по идее, специальная область ОЗУ ничем не отличается от аппаратного, программно недоступного стека упомянутых мной ST62XX.

Re: Новости об прерываниях

Пт май 05, 2017 23:26:35

Чел не врет. Например, в ARMv4 в режиме FIQ некоторые регистры продублированы. Поэтому когда происходит прерывание FIQ, процессор может обойтись без сохранения текущего контекста в стеке - он просто переключится с одного банка регистров на другой. Соответственно, если нам не нужно много локальных переменных и достаточно одних только регистров, и не будет вложенных прерываний, то можно обойтись вообще без стека.

Re: Новости об прерываниях

Сб май 06, 2017 08:18:08

Да, что-то вроде я наблюдал на Z80. Впрочем, там до прерываний дело не доходило, задача была проста: реинженирить и доработать один венгерский аппарат. Дело было несложным, учитывая наличие исходника, правда, не совпадающего с прошивкой и с комментами на... венгерском языке :) Вот в этом Z80 меня напрягала невозможность подключить конкретный банк, а только переключиться между ними (это как Т-триггер без наличия асинхронных входов R и S) . Первый ( он же и последний ) опыт с Z80 вроде был успешным.
Вот только не помню - PC был там в каждом банке или один для обоих режимов.

Re: Новости об прерываниях

Сб май 06, 2017 08:50:03

Речь о специализированных регистрах "теневого" хранения расширенной группы критических в отношении прерывания регистров (акумулятор, слово состояния, флаги) при вызове прерывания (или входе в подпрограмму по CALL.....) помимо стандартного хранения адреса возврата в обычном стеке.
Регистры спецхранения (shadow) частенько программно доступны, однако размещены совсем не в области стека, а в отдельной зоне ОЗУ.
(У 18-й эта область программно недоступна, а у "продвинутых среднемладших" находится в конце ОЗУ).
Подобие с Z80/mcs51 в отношении регистровых банков - только в случае с shadow - блоком загрузка и выгрузка содержимого происходит автоматически, а не командами, переключающими банки.
Весьма внимания к себе требует такая штука - ибо обычно по умолчанию закреплена за прерыванием высшего уровня и имеет всего один уровень вложения - надо следить за переполнением и "наложением содержимого" в случае, ежли использовано вручную при помощи CALL..... с внезапно пришедшим прерыванием (содержимое от прерывания затирает инфу для возврата из CALL..... ежли ранее не позаботиться о возможных проблемах).
8)

Re: Новости об прерываниях

Сб май 06, 2017 19:50:50

Что могло иметься в виду: Cortex-M0, например, имеет два стека: main stack и process stack (п. 2.1.2 programming manual). Соответственно, имеется два указателя стека. В режиме выполнения основной программы может использоваться main stack или process stack, в режиме обработчика исключения - только main stack.

Кроме того, этим же ядром поддерживается следующая оптимизация: если в процессе выполнения обработчика одного исключения произошло другое (но не вытеснило текущее), то по окончании обработки стек не будет сохраняться/восстанавливаться заново, а сразу произойдет переход к следующему обработчику (tail-chaining, п. 2.3.6).
Ответить