|
Что такое СТЕК и с чем его едят?, Знающим просьба пояснить простые истины...... |
|
|
|
 |
Ответов
|
Feb 23 2007, 03:08
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Стек (Stack) в переводе "палка". В применении к аппаратно-программной части микроконтроллеров это линейная часть ОЗУ, выделенная для хранения данных по принципу LIFO (Last In - First Out) Последним Вошел - Первым Вышел. Стек нужен для организации работы прерываний и подпрограмм/функций. В стеке могут хранится, как уже указал Alex B._, адреса возврата из функции/прерывания, данные для передачи параметров в/из функцию, буфер(а) для локальных переменных. Прерывания используют стек на аппаратном уровне как минимум для записи текущего адреса выполняемой программы (некоторые сохраняют в стек еще и слово состояния АЛУ ядра МК и пр.), чтобы после обработки прерывания, можно было вернуться и продолжить ее выполнение. Поэтому. если вы заранее не установили указатель стека на свободную часть ОЗУ, то при вызове прерываний последовательность выполнения программы может быть нарушена. В отличие от счетчика команд, который работает с автоинкрементом, то указатель стека работает с автодекрементом. Поэтому указателю стека обычно присваивают значение адреса не начала, а конца ОЗУ. Напротив, глобальные переменные и "куча", используемые в Си, располагаются с начала ОЗУ. Поэтому эти две области данных "растут" навстречу друг другу. Переполнение стека, при котором содержимое стека "наползает" на область глобальных переменных и/или "кучи", это одна из самых типичных и в то же время весьма трудно обнаруживаемая ошибка, возникающих при программировании МК. Есть еще другие понятия стека, например, "стек протоколов". За разъяснениями можно обратиться к Википедии, например.
|
|
|
|
|
Feb 23 2007, 03:35
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(rezident @ Feb 23 2007, 00:08)  Стек (Stack) в переводе "палка" Отличное объяснение. Перевод только немного надо подправить: стек (stack) в переводе означает "скирда, стог; кипа" (а палка это stick). Для образности ещё добавлю, что стек можно представить себе в виде автоматного магазина, патроны вставляются последовательно 1-2-3-4-5..., а вынимаются ...5-4-3-2-1. А вот в нижеприведенном фрагменте теряется безвозвратно один байт ОЗУ. Код ldi r16,high(RAMEND) out SPH,r16 ldi r16,low(RAMEND) out SPL,r16 Надо бы писать так Код ldi r16,high(RAMEND+1) out SPH,r16 ldi r16,low(RAMEND+1) out SPL,r16 Кто бы мне объяснил, почему так не делают? Инерция мышления?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 23 2007, 12:02
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425

|
Цитата(=GM= @ Feb 23 2007, 03:35)  Цитата(rezident @ Feb 23 2007, 00:08)  Стек (Stack) в переводе "палка"
Отличное объяснение. Перевод только немного надо подправить: стек (stack) в переводе означает "скирда, стог; кипа" (а палка это stick). Для образности ещё добавлю, что стек можно представить себе в виде автоматного магазина, патроны вставляются последовательно 1-2-3-4-5..., а вынимаются ...5-4-3-2-1. А вот в нижеприведенном фрагменте теряется безвозвратно один байт ОЗУ. Код ldi r16,high(RAMEND) out SPH,r16 ldi r16,low(RAMEND) out SPL,r16 Надо бы писать так Код ldi r16,high(RAMEND+1) out SPH,r16 ldi r16,low(RAMEND+1) out SPL,r16 Кто бы мне объяснил, почему так не делают? Инерция мышления? Господин GM, зачем вводите в заблуждение и так не окрепшие умы инженеров. Предложенная вами инициализация стека совершенно не правильна и работать не будет. Предлагаю вам обратить внимание на команду push This instruction stores the contents of register Rr on the STACK. The stack pointer is post-decremented by 1 after the PUSH. А так же предлагаю вам просимулировать в студии код: Код ; Ваш код RESET: ldi tmp, high(RAMEND+1); Main program start out SPH, tmp; Set stack pointer to top of RAM ldi tmp, low(RAMEND+1) out SPL, tmp
clr zero
push zero
; Правильный код RESET: ldi tmp, high(RAMEND); Main program start out SPH, tmp; Set stack pointer to top of RAM ldi tmp, low(RAMEND) out SPL, tmp
clr zero
push zero
|
|
|
|
|
Feb 23 2007, 13:56
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Dopler @ Feb 23 2007, 09:02)  Господин GM, зачем вводите в заблуждение и так не окрепшие умы инженеров. Прошу прощения, что невольно ввёл всех аврщиков в заблуждение, не хотел. Вообще, если честно, я и не предлагал так делать, просто просил объяснить мне, почему так не делают. Вот, кстати, посмотрел старые проекты с авр на борту, там исходный указатель указывает на последнюю ячейку памяти. А пошло это, скорее всего, вот откуда. Недавно интенсивно работал с TMS320C5402, надо было реанимировать старый проект, а там для push как раз предекремент стека, вот видимо и отложилось в голове, другого объяснения нет. Ну и, с праздником всех!
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 23 2007, 16:56
|

Частый гость
 
Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664

|
Цитата(=GM= @ Feb 23 2007, 12:56)  А пошло это, скорее всего, вот откуда. Недавно интенсивно работал с TMS320C5402, надо было реанимировать старый проект, а там для push как раз предекремент стека, вот видимо и отложилось в голове, другого объяснения нет. В большинстве архитектур, с которыми мне приходилось сталкиваться, действительно используется предекрементная схема (в классической системе команд PDP-11 применяемая как MOV R1, -(SP) для push, MOV (SP)+, R1 для pop. AVR в этом плане действительно извращенно реализован. Видимо, к тому были какие-то аппаратные предпосылки. Например, проще поместить в память по адресу указателя байт, а потом параллельно с выборкой следующей инструкции уже декрементировать указатель стека. Но это только версия, а на деле имеем то, что имеем - такой подарок писателям RTOS-ов под AVR :-)
|
|
|
|
Сообщений в этой теме
Potter Что такое СТЕК и с чем его едят? Feb 23 2007, 01:13 Alex B._ >> Пять лет успешно программля на С
успешно?... Feb 23 2007, 01:43 Potter Цитата(Alex B._ @ Feb 23 2007, 02:43) усп... Feb 23 2007, 09:39  Dog Pawlowa Цитата(Potter @ Feb 23 2007, 10:39) Я про... Feb 23 2007, 09:54  aleksey_g Цитата(Potter @ Feb 23 2007, 08:39) Я про... Feb 23 2007, 12:28  defunct Цитата(Potter @ Feb 23 2007, 08:39) Цитат... Feb 23 2007, 13:32     defunct Цитата(osnwt @ Feb 23 2007, 15:56) Но это... Feb 23 2007, 17:15      osnwt Цитата(defunct @ Feb 23 2007, 16:15) Цита... Feb 23 2007, 17:50       defunct Цитата(osnwt @ Feb 23 2007, 16:50) участк... Feb 23 2007, 18:39        osnwt Цитата(defunct @ Feb 23 2007, 17:39) Плох... Feb 24 2007, 00:04    Dopler Цитата(=GM= @ Feb 23 2007, 13:56) Прошу п... Feb 23 2007, 23:06 SasaVitebsk Если быть более точным, то направление куда ... Feb 23 2007, 03:37 beer_warrior Еще вдогонку - через стек передаються в функцию ... Feb 23 2007, 09:49 SasaVitebsk Соглашусь с defunct.
Ошибки в компиляторах и опер... Feb 23 2007, 22:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|