Отговори на тема  [ 8 мнения ] 
C18 въпросчета 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение C18 въпросчета
Не мога да си обясня как процедира С18 при викане на функция през функция. При MSP430 ( от малкият опит който имам) ако извикаш функция от друга или от ISR, дава грешка от типа "Загубен адрес за връщане". При С18 установих че това не се случва и се чудя как са го организирали, и до каква дълбочина може да се направи.


Вто Юли 09, 2013 8:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: C18 въпросчета
пик18 има 32 нива на return stack - с други думи до 32 викания можеш да правиш без да се "загуби". Допълнително прекъсването с висок приоритет запазва и WREG,BSR и още 2-3 регистъра във фаст ретърн стак - при retfie 1 ги възстановява при самото връщане (демек в самия цикъл на връщането). С други думи това си е "опция" на хардуера :) Пик16 имат 8 нива.


Вто Юли 09, 2013 8:21 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Юни 09, 2012 12:23 am
Мнения: 146
Местоположение: София/Стара Загора
Мнение Re: C18 въпросчета
Това ми е е известно. Интересува ме компилатора прави ли някои неща за които програмиста не трябва да се тревожи. Сега направих следното:
Код:
void timer2_init(void)
{   
    timer2_init();
}

Това е някакъв вид рекурсия и очаквам в симулатора по някое време да ме наплюе.
Фаст ретър мисля беше само веднъж възможно да се извика след като вече е използван. И след това по традиционният начин.


Вто Юли 09, 2013 8:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: C18 въпросчета
Ами според мене няма да се разсърди на тази ракурсия. Сега - има два варианта - има фюз който определя какво да направи пика при buffer overrun/underrun - резет или нищо. Ако е нищо, специално при тая ракурсия ще се върща винаги в нея (предполагам) и напрактика накрая ще зацикли във връщането. Мисля че когато се надхвърли буфера, най стария адрес се загубва. За underrun не съм много сигурен обаче.


Сря Юли 10, 2013 8:29 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: C18 въпросчета
Така написано, че ще забие все някога... Ще забие.
Но зависи от компилатора, той си симулира истински стек, така че ще гръмне като заталачите него. Поне микрочепския е така, хардуерния стек е само за прекъсвания. А точно написаните функции нямат кой знае каква консумация на стек, та бая може да се се извърти....

Какво ще се случи като прелее стека - ще почне да маже върху хипа и статичните променливи. Няма вградена защита срещу това, твоя отговорност си е да се грижиш да не прелее.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Юли 11, 2013 12:06 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C18 въпросчета
Цецо написа:
хардуерния стек е само за прекъсвания.


Тсъ. И за прекъсвания, и за викане на подпроглами е. Софтуерния "стек" при PIC18 практически не е стек, и ракурсия е забранена (справка - ръководството).

Ако бъркам ме поправете, ама мисля имаше "теория" че всяка рекурсивна програма може да се направи и без рекурсия. Ако пък много се държи на това - нито PIC18 e процесора, нито C18 или XC8 e компилатора За тая цел. Огледай се към PIC24/dsPIC30/33 или PIC32. При последното стека е софтуерен но си е съвсем истински. При 24-ката мисля че пак така.


Чет Юли 11, 2013 12:22 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: C18 въпросчета
Да ти кажа, не съм гледал творбите на компилатора от поне 5 години. Но имам спомени, че C18 си организираха софтуерен стек през индексния регистър. И в линкерския фаил си имаш парче за стек. Беше нещо извратено, но мязаше на стек погледнато отстрани :)

Сигурен ли си, че говорим за едно и също нещо?

П.С.
Не може да няма стек, при положение, че имаш променливи от клас auto. Той процесора регистри за шир потреба няма, така, че ще неще трябва да са в стека:

Цитат:
unsigned char DecodeFrame(void) {
0664 CFD9 MOVFF 0xfd9, 0xfe6
0666 FFE6 NOP
0668 CFE1 MOVFF 0xfe1, 0xfd9
066A FFD9 NOP
066C 0E02 MOVLW 0x2
066E 26E1 ADDWF 0xfe1, F, ACCESS
8: auto unsigned char i, k;
9: i = 0;
0670 6ADF CLRF 0xfdf, ACCESS
10: for(k = FRAME_FIELD_SHORT_DATA; k < SHORT_FRAME_SIZE - 1; k++) //calc checksum
.....
06B4 6EF5 MOVWF 0xff5, ACCESS
06B6 0E02 MOVLW 0x2
06B8 5CE1 SUBWF 0xfe1, W, ACCESS
06BA E202 BC 0x6c0
06BC 6AE1 CLRF 0xfe1, ACCESS
06BE 52E5 MOVF 0xfe5, F, ACCESS
06C0 6EE1 MOVWF 0xfe1, ACCESS
06C2 50F5 MOVF 0xff5, W, ACCESS
06C4 52E5 MOVF 0xfe5, F, ACCESS
06C6 CFE7 MOVFF 0xfe7, 0xfd9
06C8 FFD9 NOP
06CA 0012 RETURN 0


Позабравил съм асемблера на 18ките, ама това непрекъснато мазане в регистри започващи с f, си мяза на индексно адресиране, демек правят стек. Поне така ми се струва де....

Ето ти и скрин шот от мануала, опитали са се да направят истински компилатор, до колкото им позволява желязото де:

Прикачени файлове:
Clipboard01.jpg
Clipboard01.jpg [ 115.62 KiB | Прегледано 1704 пъти ]

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Чет Юли 11, 2013 9:31 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: C18 въпросчета
Променливите от тип auto се резервират на точно определено място в "стека". Например променлива "а" на функция 1 се намира на адрес 10 в стека, променлива "b" на функция 2 на адрес 12, и т.н. Анализира се коя коя функция вика, и когато е възможно няколко функции използват един и същ адрес в стека, когато е невъзможно да се омажат, тоест в момента по веригата извиквания да са едновременно активни.

Тоест, "стека" не е стек, а просто адресно пространство за auto променливите, с възможност един и същ адрес да се ползва едновременно от няколко подпрограми, стига те да не се извикват една друга по веригата извиквания.

...това е за XC8 във варианта му за PIC18, и си го пише в ръководството.

ПП: Сега обаче погледнах ръководството на C18 - изглежда там си е нормален стек. Тоест, извинявам се за заблудата. Явно твърденията ми важат само за XC8 компилатора. Същия впрочем си преценява автоматично колко "стек" му трябва и е доста пестелив откъм използвана RAM. Оригинално няма linker script. Тепърва ще го боря че трябва да правя USB bootloader и ще ми се изясни и какво замества linker script-а.


Чет Юли 11, 2013 11:18 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

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


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

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