Отговори на тема  [ 15 мнения ] 
Реализация на програмен стек 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение Реализация на програмен стек
Здравейте на всички.Опитвам се да направя програмен стек на процесор PIC18f4620 на MicroC pro . Попринцип за да се реализира , трябра да се прочетат регистрите TOSU,TOSH,TOSL.Прочитам ги и ги съхранявам на отделни променливи от тип char , понеже са си осем битови.Проблема е че когато се опитам да освободя повече място как може да се реализира , примерно да съхранявам целия стек в рам паметта и после след извикване на функцията примерно да възстановявам.Споделете как може това да се реализира . Ето с кое започнах :

unsigned char STOSU=0,
STOSH=0,
STOSL=0;
....................................
void Menu(){

STOSU=TOSU;
STOSH=TOSH;
STOSL=TOSL;
..................................
return;
}


Пон Апр 19, 2010 9:20 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
А каква е идеята в този стек да вмъкваш регистрите от хардуерния стек на процесора ? При всяко извикване на подпрограма тези регистри се пазят автоматично в хардуерния стек, до който нямаш достъп.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пон Апр 19, 2010 10:48 pm
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение 
Идеята на този софтуерен стек е , когато кода е много тромав , има много прекъсвания , извикване на подфункции с две думи при препълване на стека . При PIC18 серия има и вариант за реализиране на софтуерен стек , като при прочитането на регистрите TOSU,TOSH,TOSL които сочат TOS да се извлече върха на стека ,демек последното прекъсване .Те са свободни от страна на програмиста и понеже Рам паметта е дооста свободна , да се заделя там :)


Пон Апр 19, 2010 11:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение 
Стек в общото адресно пространство може да потрябва по много много причини.
Скрит хардуерен стек е идея, захвърлена в зората на процесорите.

Все трябва да има вариант да накараш процесора да напъха регистрите в стека
си (някакво прекъсване) и после един по един да ги вадиш и да ги копираш в
стека организиран някъде из паметта. Както и обратното.

Но да се мъчиш да правиш *такова* нещо на език от високо ниво си е не перверзия,
ами чисто губи време.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Вто Апр 20, 2010 3:19 am
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Авг 18, 2007 11:39 am
Мнения: 137
Местоположение: Русе
Мнение 
По тоя въпрос свързан с ПИК18 ни казваха, че има някакъв бърз стек с дълбочина 1,2 адреса. Някой може ли да напише има ли вярно и за какво се използва щото преподавателите дето ни учат на това не са много на ТИ с тая наука.Най- смешното е че щом е бърз, нормалния стек толкова ли е бавен :D , че да сложат друг бърз стек.


Вто Апр 20, 2010 9:35 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
Вземи отвори един "Data Sheet" на 18-ka и намери "FAST REGISTER STACK". Там си е написано какво и как! :wink:


Вто Апр 20, 2010 10:02 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Мисля, че ако се опре до там 31 нива на стека да не стигат, значи е сбъркана платформата,
по-добре да се мине на друг микроконтролер, отколкото да се правят такива гимнастики.
Не че не е възможно, напротив, ако се поровиш в AN на Microchip ще намериш такава реализация
за първите 16-ки, които имаха само 2 нива на стека. Обаче процесора става много бавен и тромав,
това на всяко викане на подпрограма започва да харчи от 20 до към 40 инструкции в повече. Ако
е само да запазиш използваните променливи и служебни регистри в подпрограма обработваща
дадено прекъсване, то въобще не нужен стек. Правиш си един масив и си запазваш там всички
променливи, на излизане ги възстановяваш. Но това обикновено се прави на асемблер, за да може
прекъсването да е максимално кратко.

"Бързия" стек на PIC18 се използва при прекъсванията с висок приоритет. Тогава влизайки в прекъсването ядрото си запазва няколко регистъра в този стек, както е при останалите микроконтролери и процесори, при прекъсванията с нисък приоритет това го прави програмиста. И понеже първото се прави автоматично го наричат "бърз" стек. Но този стек имаше доста бъгове по него в първоначалните версии, после май го оправиха. За да нямам главоболия и да следя коя версия са ми продали от магазина, въобще не
го използвам.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Вто Апр 20, 2010 4:14 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Аз досега не съм имал грижи с Fast Register Stack. Само дето съвсем не е достатъчен. FSR-ите например в 95% се налага да се помнят. Пък и други регистри се налага да се пазят. А за стека на преходите - досега не съм имал случай да го напълня. Само ракурсия не съм пробвал да видя как ще стане :)


Вто Апр 20, 2010 8:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Ное 22, 2004 11:24 pm
Мнения: 1923
Местоположение: Габрово
Мнение 
Това винаги ми се е струвало голяма глупост - да ограничиш размера на стек-а.
В момента пиша една програма за R8C25 там стек-а се задава при създаване на проекта. След като набутах в кода няколко sprintf-а се оказа че стек-а ми е малко просто го увеличих и толкоз. Дефинира се като област от RAM-a. :wink:


Сря Апр 21, 2010 5:49 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Е да де ама то пик-а нали знаеш, че не е като другите. Обаче за сметка на това се връща в рамките на два клока ... На практика софтуера трябва да се грижи само да не надхвърли 32-та прехода.


Сря Апр 21, 2010 7:41 pm
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Съб Май 17, 2008 11:01 pm
Мнения: 238
Мнение 
По скоро да , когато примерно стека достигне 31 ниво тогава автоматично със всяко едно потъване,да се зарежда в Оперативната памет РАМ неговия връх TOS (Top On Stack) . По скоро е добре да бъде реализиран така този софтуерен стек :)


Сря Апр 21, 2010 9:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Ное 22, 2004 11:24 pm
Мнения: 1923
Местоположение: Габрово
Мнение 
nikolovs написа:
По скоро да , когато примерно стека достигне 31 ниво тогава автоматично със всяко едно потъване,да се зарежда в Оперативната памет РАМ неговия връх TOS (Top On Stack) . По скоро е добре да бъде реализиран така този софтуерен стек :)



Мда... Още едно нещо което да го мислиш как ще стане, и после да дебъгваш... :roll: :?


Сря Апр 21, 2010 10:17 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 13, 2007 12:12 pm
Мнения: 712
Мнение 
"nikolovs" , защо не четеш стенвестници преди да питаш? :) Пълно е в нета с инфо!
http://www.freeweb.hu/t-t/elokep/pic/do ... an818a.pdf


Сря Апр 21, 2010 10:49 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Ако наистина ти е много тромав кода и с много писане в стека опитай:
rtos

В real time изпълненията всеки thread (нишка) си има собствен стек. не се грижиш кое след кое се изпълнява. Просто си правиш нишка за всяко нещо което трябва да правиш. Така работата ще се разпредели по нишки. Е, по-тромаво е решението щото май във всички real time OS се копира целия стек преди да се превключи към друга нишка. Все пак ако имаш сложен проект опростява нещата.
Това разбира се ако си в началото на проекта. Ако трябва да го пренаписваш само заради препълване на стека - не е най-доброто решение.


Чет Апр 22, 2010 1:47 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
А сигурно ли е че стека се препълва - на 18-ка. Щото ако е така значи нещо не е като хората в програмата. Какво ще рече това много прекъсвания - вектора ти е един (два ако ползваш приоритет) - тука имаш 2 нива. Компилатора да ползва 4-6. Останалите 20 и няколко са за тебе това значи 20 call-а един след друг. Ако и това не ти стига има два варианта - или наистина си сбъркал платформата или нещо си сбъркал програмата. Все пак тия дървета не са направени да търкалят W7.


Чет Апр 22, 2010 8:50 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 15 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни