Jump to content

Стек


l.sea
 Share

Recommended Posts

По постам от Марка отодвинул до лучших времен Си,и "упёрся"в асемблер.

В пределах понимания порты,регистры,таймеры,банки,

Но вот stek- как понять как он работает?

В инете нашел только формулировку-первый пришел,последний вышел.

тоесть понимаю стек это как регистр ,с которогонапример со второго бита нельзя сосчитать

покане сосчитаешь с нулевого и с первого-правильно?

Зачем стек и как он работает?-обьясните пожалуйста в форме доступной для понимания начинающего.

Link to comment
Share on other sites

Стек это область оперативной памяти для временного хранения данных. Программисту не требуется запоминать расположение данных, достаточно знать порядок их занесения. В микроконтроллерах PIC стек это отдельное ОЗУ. Стек заточен под сохранение счетчика команд, то есть имеет такую же разрядность и используется командами перехода на подпрограммы и возврата из них.

Посмотрите описание команд CALL, RCALL,RETURN,RETLW,RETFIE

Edited by Станислав
Link to comment
Share on other sites

Стек это область оперативной памяти для временного хранения данных. Программисту не требуется запоминать расположение данных, достаточно знать порядок их занесения.

Понятно что не ЕЕПРОМ,не пойму на счет -запоминать и что за порядок занесения

В микроконтроллерах PIC стек это отдельное ОЗУ. Стек заточен под сохранение счетчика команд, то есть имеет такую же разрядность и используется командами перехода на подпрограммы и возврата из них.

Посмотрите описание команд CALL, RCALL,RETURN,RETLW,RETFIE

Спасибо,но нифига не понял.

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

А со стеком ни фига непонятно

Edited by l.sea
Link to comment
Share on other sites

Выгодные LED-драйверы MOSO для индустриальных приложений

Компэл представляет выгодные светодиодные драйверы MOSO для промышленных решений с высоким классом защиты от внешних воздействующих факторов, хорошей устойчивостью к импульсным помехам и высокой надежностью. В ряде серий реализована возможность дистанционного контроля, кроме того, отдельные версии драйверов могут программироваться на работу в автономном режиме по заранее заданному сценарию. Рассмотрим подробнее их характеристики. 

Читать статью>>

......."по её завершении начинает работать основная программа и обязательно с точки её останова."

Вот эта точка и хранится в стеке.

Link to comment
Share on other sites

ER10450 – литий-тионилхлоридная батарейка FANSO EVE Energy формата ААА
Компания FANSO EVE Energy расширила номенклатуру продукции, разработав новый химический источник тока (ХИТ) – батарейку литий-тионилхлоридной электрохимической системы (Li-SOCl2; номинальное напряжение 3,6 В) типоразмера ААА – ER10450. Батарейка имеет бобинную конструкцию (тип Energy) и предназначена для долговременной работы при малых токах.
Батарейка может применяться в приборах учета ресурсов, в различных датчиках, устройствах IoT и в других приборах и устройствах, в которых требуется компактный ХИТ соответствующей емкости.
Подробнее >>

......."по её завершении начинает работать основная программа и обязательно с точки её останова."

Вот эта точка и хранится в стеке.

Вообщем на работе стека заморачиваться ненадо-правильно?

Понимать восьми уровневый стек можно как 8мест в программе(вход-выходов с прерываний),

тоесть девятая подпрограмма прерываний работать не будет,или при выходе с прерываний попадет не в то место,

это и есть понятие стека?

Link to comment
Share on other sites

Новое семейство HRP/N3 от MEAN WELL – ИП с 350% перегрузкой для промышленных приложений

В промышленных устройствах и установках с электроприводом на двигателях постоянного тока в момент пуска требуется обеспечить повышенный ток. Для решения этой задачи MEAN WELL предлагает вместо ИП с повышенной избыточной мощностью, более оптимальное решение - источник питания с необходимой перегрузочной способностью семейства HRP/N3. 

Новое семейство, представленное в Компэл, экономичнее и расширяет уже существующее HRP/N в увеличении кратности перегрузки. Подробнее>>

Чтобы представить стек ( stack - англ ) представьте магазин автомата( или пистолета ). Патрон помещаемый в него первым, при стрельбе выйдет последним. Патрон помещаемый последним, выйдет из него первым. В этом вся соль. Такой механизм и называется стеком. Только в микроконтроллере в него помещаются адреса возврата.(и не только)

Пока ты жив, надежда есть.

Link to comment
Share on other sites

Чтобы представить стек ( stack - англ ) представьте магазин автомата( или пистолета ). Патрон помещаемый в него первым, при стрельбе выйдет последним. Патрон помещаемый последним, выйдет из него первым. В этом вся соль. Такой механизм и называется стеком. Только в микроконтроллере в него помещаются адреса возврата.(и не только)

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

но что за АДРЕСА ВОЗВРАТА???

И зачем они нужны?

Как пользовпться стеком?

В программе происходит всё само собой,типа как в АЛУ,тоесть знать что предел-8 преоываеий?

Можно простенький примерчик ,пару строчек с крментариями?

Link to comment
Share on other sites

Адрес возврата = адрес следующей за

CALL proc_123

инструкции

здесь proc_123 - взято для примера

могу написать более подробно как это происходит в x86 реальном режиме процессора

пояснение для ГУРУ - упростил!

Link to comment
Share on other sites

Все дело в таком механизме, как уход в прерывания и вызов подпрограмм.

Программисту не нужно заботится откуда и куда производятся скачки, адрес ухода из родительского цикла(содержимое РС и при желании других важных регистров), заносится в стек, и по завершении дочернего цикла, восстанавливается из стека. Устройство стека, подобное магазину пистолета, позволяет организовывать вложенность циклов, количество вложенных циклов, определяется глубиной стека...Так что за заполнением стека, нужно следить, при его переполнении произойдет крах программы.

Можно простенький примерчик ,пару строчек с крментариями?

Абстрагируемся от конкретного камня....

Выполняется программа.

Установился флаг аппаратного прерывания...

В стек, сразу же заносится текущее содержимое РС (адрес возврата)

В РС записывается адрес вектора данного прерывания, и осуществляется переход к подпрограмме обработки. Как только, встречается команда выхода из прерывания, в РС из стека восстанавливается адрес возврата, и программа продолжает выполнятся, как ничего и не было.

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Link to comment
Share on other sites

Выполняется программа.

Установился флаг аппаратного прерывания...

В стек, сразу же заносится текущее содержимое РС (адрес возврата)

В РС записывается адрес вектора данного прерывания, и осуществляется переход к подпрограмме обработки. Как только, встречается команда выхода из прерывания, в РС из стека восстанавливается адрес возврата, и программа продолжает выполнятся, как ничего и не было.

вообщем я как понял програмисту пишещему на асме не нужно знать механизм работы стека,а нужно лишь знать какова глубина стека.

Например если 8ми .то значит поддежка 8ми прерываний,а если процессор без стека то прерывания не поддерживаются-ПРАВИЛЬНО?

Link to comment
Share on other sites

нет, не правильно.

Прерывания тут не причем.

Причем тут вызовы подпрограмм.

А так как обработчик прерываний и есть по сути подпрограмма, то и механизм стека тут задействован.

Т.е. Вы не имеете право делать вызовов подпрограмм, включая прерывание, глубиной более чем 8.

Если стек будет переполнен, то первые записанные данные будут пропадать, в стеке всегда будут последние 8.

Программисту нужно знать не только механизм работы стека, но и вообще все механизмы функционирования МК.

Пример.

У базового семейства ПИКов (например 10-ые) нет прерываний. Но стек есть глубиной 2 регистра.

Edited by my504
Link to comment
Share on other sites

вообщем я как понял програмисту пишещему на асме не нужно знать механизм работы стека,а нужно лишь знать какова глубина стека.

Например если 8ми .то значит поддежка 8ми прерываний,а если процессор без стека то прерывания не поддерживаются-ПРАВИЛЬНО?

АСМ, язык низкоуровневый, и мы спокойно можем из программы изменить и глубину стека, да и его содержимое, только последствия трудно предсказать :rolleyes:

Процессор без стека-нонсенс!

И еще, стек не только запоминает адреса возврата, посмотрите команды pop, push, при уходе, например, в прерывание, как правило, сохраняются аккумулятор, регистр слова-состояния, и любые необходимые данные, которые в процессе работы подпрограммы могут модифицироваться и при выходе востанавливаются.

Количество возможных программно-аппаратных прерываний, никак не связано с размером стека, а вот с глубиной вложенности циклов и количеством запоминаемой при этом информации- напрямую!

Errare humanum est. Коли людЯм позволено, что же о нас то говорить!
 

Link to comment
Share on other sites

.........И еще, стек не только запоминает адреса возврата, посмотрите команды pop, push, при уходе, например, в прерывание, как правило, сохраняются аккумулятор, регистр слова-состояния, и любые необходимые данные, которые в процессе работы подпрограммы могут модифицироваться и при выходе востанавливаются.

Количество возможных программно-аппаратных прерываний, никак не связано с размером стека, а вот с глубиной вложенности циклов и количеством запоминаемой при этом информации- напрямую!

Вы пишете правильно, но запутываете автора в конец...

Он не в состоянии пока въехать в конкретную архитектуру, а Вы без объяснения общего, объясняете частности.

У рассматриваемого семейства (среднего, 12...16-ые) ПИКов нет команд записи и извлечения из стека. И стек программно недоступен.

Link to comment
Share on other sites

Он не в состоянии пока въехать в конкретную архитектуру, а

Вьехать непросто ...

О стеке прочитал на сайте Генадия Корабельникова,по ссылке с микрочипа.ру

Очень обьёмно там всё,но может я такой,но слабо понятно,потом есть закрытая ифа ,

к стати не понял где регистрация чтоб в закрытые отделы попасть?

Вот здесь- http://www.pcports.ru/Articles.php прекрасно излагает автор,но мало.

Уважаемый Марк ,вообщем начинающему можно писАть простенькие программы и

на стек не обращать внимание-верно?

Link to comment
Share on other sites

Даже простенькая программа может переполнить стек.

Например несколько вложенных подпрограмм (call) и в добавок прерывание.

Или типичная ошибка начинающих - выход из обработчика по goto.

Разве Вам не понятна модель стека, как обойма пистолета или автомата.

Пока программа исполняется линейно или с переходами - стек не нужен. Как только требуется вызвать подпрограмму, необходимо запомнить адрес точки выхода. Запоминают не саму эту точку, а следующую за ней (т.е. ту, на которую при выходе из подпрограммы необходимо вернуться).

так вот при выполнении команды call адрес следующей за ней команды заносят в стек.

Стек - это несколько необычное ОЗУ, у этого ОЗУ адресные линии подключены к реверсивному счетчику. Записали в ОЗУ (после того как записали) - увеличили этот счетчик на 1. Перед тем как прочитать - уменьшили на 1.

Этот реверсивный счетчик называется указатель стека. Таким образом указатель все время указывает на ВЕРШИНУ стека. Вершина стека - это ячейка (слово) этого ОЗУ доступная для контроллера. Остальные ячейки недоступны. Т.е. такая память имеет ПОСЛЕДОВАТЕЛЬНУЮ выборку (в отличии от произвольной в обычном ОЗУ).

Когда подпрограмма выполнена, вершина стека снова переписывается в счетчик команд контроллера и программа оказывается в том месте откуда она вышла на исполнение подпрограммы.

Edited by my504
Link to comment
Share on other sites

Можно стек представить так: допустим глубина стека равна 3

тело программы

|

вызов подпрограммы_0 -> запись адреса следующей команды в стек_0

|{

вызов подпрограммы_1 -> запись адреса следующей команды(в подпрограмме_0) в стек_1

|

вызов подпрограммы_2 -> запись адреса следующей команды(в подпрограмме_1) в стек_2

|}

след.команда

|

тело программы

Возврат после выполнения подпрограммы_2 будет 2 -> 1 -> 0 -> следующая команда после команды вызова подпрограммы_0 -> продолжение выполнения тела программы.

Тут я попытался нарисовать вложенные вызовы подпрограмм, которых при глубине стека =3 должно быть не более 3-х,

если добавить 4-е то это тогда затрётся самый нижний адрес, что вызовет крах программы т.к потеряется точка возврата.

Надеюсь теперь более ясно представишь себе работу стека.

Edited by a_sergeevich

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...