Re: přístup na byty v int C

Andrej Jancura aj.hwlist na gmail.com
Pátek Listopad 1 16:59:37 CET 2013


Ahoj Riso,

architektura PIC16 nema zasobnik ako taky, cize parametre nejdu predavat
cez stack, tak ako je to pri inych jadrach. Tu je len call a return a mozes
mat vnorenych max. 8x call. Potom nastane pretecenie zasobnika.

Parametre sa tu predavaju tak, ze sa urobi program flow a zisti sa kolko
bytov ram treba na predanie parametrov jednotlivym funkciam a ci sa nahodou
z nich nevolaju aj ine rutiny. Podla toho sa vyhradi v bankach ram pocet
bytov a tam sa normalne parametre ukladaju cez movfw instrukciu. Takze
mozes mat napr. dve rutiny

void fn1(unsigned int Cycles)
void fn2(unsigned char Steps)

a na zasobniku bude vyhradene miesto takto:

premenna             adresa
fn1 na Cycles      .... 1
fn1 na Cycles +1 .... 2

fn2 na Steps       .... 1, kde sa rutiny navzajom nevolaju,
fn2 na Steps       .... 3, pokial sa rutiny volaju navzajom

a potom uz rutina pracuje s fixnymi adresami premennych.

Kompilator ma este jeden typ premnnej a to btemp, co nie je nic ine ako
vyhradenych 4,8,12... bytov v pamatovom bloku, ktory je pristupny vo
vsetkych pamatovych bankach RAM a moze sa na tento blok pozerat ako na "16x
8bitovych registrov". Vacsinou sa to pouziva na ukladanie premennych pri
preruseni, aritmetickych operaciach a pod. Takto to funguje na architekture
PIC16.

PIC18 a PIC16F1xxx su uz takym mixom s roznymi vylepseniami a v podstate sa
da povedat, ze PIC18 je uz parodia na AVR, ktora sa objavila zhruba rok
potom, co prisli norski studenti s AVR...

A.


Dňa 1. novembra 2013 14:26, Richard Kaliciak
<hw.kaliciak na stonline.sk>napísal(-a):

> Ahoj Andy,
>
> este sa vratim k tomu tvojmu prikladu:
>
> void Delay(unsigned long int Cycles)
>    while(Cycles--)
>     ;
>
> nebude to tym, ze ta premenna Cycles je ulozena v zasobniku? Skus ju
> definovat lokalne, napr.
>
> void Delay(unsigned long int Cycles)
> { unsigned long int lCycles;
> lCycles = Cycles;
>   while(lCycles--)
>     ;
>
> }
>
> Riso.
>
> Am 31.10.2013 11:28, schrieb Andrej Jancura:
> > Dobry den,
> >
> > starsie verzie prekladaju i++ tak, ze tam je skutocne incfsz a cela
> > konstrukcia ma 8 instrukcii a to na 35 rocnej architekture PIC16. Cize
> > tak ako ste to odhadol, ten princip. Preco novsie verzie pouzivaju tu
> > sialenu konstrukciu neviem, ale da sa vytusit, ze za tym mozu byt
> > rozne dovody. Ono je aj tak celkom zaujimave filozofovanie, preco ten
> > kompilator negeneruje najoptimalnejsi kod, a to aj v platenej verzii.
> > Rozoberat to zbytocne nechcem, lebo problem pristupu k typu int cez
> > byty sa tu rozoberal uz aspon tri krat a vzdy sme skoncili pri
> > kompilatore C... A poznamkami preco je PIC16 na nic. Tym nechcem
> > povedat, ze novsie cipy nie su dobre, ale mozu byt aj ine prakticke
> > dovody, preco robit so zabehnutymi typmi.
> >
> > Tymto by som rad tuto diskusiu z mojej strany uzavrel.
> >
> > A.
> >
> >
> > Dňa 31. októbra 2013 0:19, Radek Benedikt <benedikt na lphard.cz
> > <mailto:benedikt na lphard.cz>> napísal(-a):
> >
> >     > unsigned long i;
> >     > ...
> >     > i++;
> >     >
> >     > 0xFFEA: MOVLW 0x1
> >     > 0xFFEC: ADDWF i, F, ACCESS
> >     > 0xFFEE: MOVLW 0x0
> >     > 0xFFF0: ADDWFC 0x8, F, ACCESS
> >     > 0xFFF2: MOVLW 0x0
> >     > 0xFFF4: ADDWFC 0x9, F, ACCESS
> >     > 0xFFF6: MOVLW 0x0
> >     > 0xFFF8: ADDWFC 0xA, F, ACCESS
> >     >
> >     > Cize celkom pochopitelny kus "assembleru". Nulovanie W po kazdej
> >     > inkrementacii je predpokladam dan za free verziu kompilatora -
> >     pouziva
> >     > sa vseobecne pripocitanie 32-bitovej konstanty k premennej, bez
> >     ohladu
> >     > na to, ze jedno z nich je skratka jednotka.
> >
> >     Drobne upresneni naokraj:
> >     Ta jednotka je taky 32bitova, ono to neni zas tak nebezne,
> >     pricitat 0 +
> >     carry k casti promenne. Pravda, sice je obcas videt preskoc
> >     nasledujici
> >     instrukci(e), kdyz neni prenos a tou nasledujici instrukci je
> >     inkrement
> >     casti promenne. Opravuji se, dost (vetsina ?) procesoru
> >     nenastavuje pri
> >     inkrementu prenos a protoze se pricita jednicka k vicebitove
> promenne,
> >     tak je mozne testovat byte na nulu. Takze preskoc nasledujici
> >     instrukci(e) neni-li nula. A to celkem trikrat, takze to nebude
> kratsi
> >     nez priklad nahore. A tusim ze to nebude na PICu ani rychlejsi. To by
> >     musel mit podmineny skok, ne jen preskok.
> >
> >     Radek (benedikt2hw.cz <http://benedikt2hw.cz>)
> >
> >
> >     _______________________________________________
> >     HW-list mailing list  -  sponsored by www.HW.cz <http://www.HW.cz>
> >     Hw-list na list.hw.cz <mailto:Hw-list na list.hw.cz>
> >     http://list.hw.cz/mailman/listinfo/hw-list
> >
> >
> >
> >
> > _______________________________________________
> > HW-list mailing list  -  sponsored by www.HW.cz
> > Hw-list na list.hw.cz
> > http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20131101/50a0f290/attachment.htm>


Další informace o konferenci Hw-list