Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

C18 въпросчета
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=11523
Страница 1 от 1

Автор:  polinom [ Вто Юли 09, 2013 8:15 pm ]
Заглавие:  C18 въпросчета

Не мога да си обясня как процедира С18 при викане на функция през функция. При MSP430 ( от малкият опит който имам) ако извикаш функция от друга или от ISR, дава грешка от типа "Загубен адрес за връщане". При С18 установих че това не се случва и се чудя как са го организирали, и до каква дълбочина може да се направи.

Автор:  Cekins [ Вто Юли 09, 2013 8:21 pm ]
Заглавие:  Re: C18 въпросчета

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

Автор:  polinom [ Вто Юли 09, 2013 8:56 pm ]
Заглавие:  Re: C18 въпросчета

Това ми е е известно. Интересува ме компилатора прави ли някои неща за които програмиста не трябва да се тревожи. Сега направих следното:
Код:
void timer2_init(void)
{   
    timer2_init();
}

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

Автор:  Cekins [ Сря Юли 10, 2013 8:29 pm ]
Заглавие:  Re: C18 въпросчета

Ами според мене няма да се разсърди на тази ракурсия. Сега - има два варианта - има фюз който определя какво да направи пика при buffer overrun/underrun - резет или нищо. Ако е нищо, специално при тая ракурсия ще се върща винаги в нея (предполагам) и напрактика накрая ще зацикли във връщането. Мисля че когато се надхвърли буфера, най стария адрес се загубва. За underrun не съм много сигурен обаче.

Автор:  Цецо [ Чет Юли 11, 2013 12:06 am ]
Заглавие:  Re: C18 въпросчета

Така написано, че ще забие все някога... Ще забие.
Но зависи от компилатора, той си симулира истински стек, така че ще гръмне като заталачите него. Поне микрочепския е така, хардуерния стек е само за прекъсвания. А точно написаните функции нямат кой знае каква консумация на стек, та бая може да се се извърти....

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

Автор:  sparkybg [ Чет Юли 11, 2013 12:22 am ]
Заглавие:  Re: C18 въпросчета

Цецо написа:
хардуерния стек е само за прекъсвания.


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

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

Автор:  Цецо [ Чет Юли 11, 2013 9:31 am ]
Заглавие:  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 | Прегледано 1708 пъти ]

Автор:  sparkybg [ Чет Юли 11, 2013 11:18 am ]
Заглавие:  Re: C18 въпросчета

Променливите от тип auto се резервират на точно определено място в "стека". Например променлива "а" на функция 1 се намира на адрес 10 в стека, променлива "b" на функция 2 на адрес 12, и т.н. Анализира се коя коя функция вика, и когато е възможно няколко функции използват един и същ адрес в стека, когато е невъзможно да се омажат, тоест в момента по веригата извиквания да са едновременно активни.

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

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

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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/