Перейти к содержанию

Стек


l.sea

Рекомендуемые сообщения

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Изменено пользователем Станислав
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

Изменено пользователем l.sea
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

CALL proc_123

инструкции

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

Пример.

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

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

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

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

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

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

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

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

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

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

|

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

|{

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

|

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

|}

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

|

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

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

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

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

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

Изменено пользователем a_sergeevich

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

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...