| Микроконтролери и електроника 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 ги възстановява при самото връщане (демек в самия цикъл на връщането). С други думи това си е "опция" на хардуера |
|
| Автор: | polinom [ Вто Юли 09, 2013 8:56 pm ] | |||||||||
| Заглавие: | Re: C18 въпросчета | |||||||||
Това ми е е известно. Интересува ме компилатора прави ли някои неща за които програмиста не трябва да се тревожи. Сега направих следното:
Това е някакъв вид рекурсия и очаквам в симулатора по някое време да ме наплюе. Фаст ретър мисля беше само веднъж възможно да се извика след като вече е използван. И след това по традиционният начин. |
||||||||||
| Автор: | 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. Той процесора регистри за шир потреба няма, така, че ще неще трябва да са в стека:
Позабравил съм асемблера на 18ките, ама това непрекъснато мазане в регистри започващи с f, си мяза на индексно адресиране, демек правят стек. Поне така ми се струва де.... Ето ти и скрин шот от мануала, опитали са се да направят истински компилатор, до колкото им позволява желязото де: |
||||||||||
| Автор: | 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/ |
|