190 likes | 334 Views
K e il C. Uvod. K e il C je jedno proširenje ANSI C-a i sastoji se od: Memorijskih tipova i oblasti u 8051 Memorijski modeli Podrška za bit adresibilne lokacije Podrška za SFR Atributi funkcija. K e il C - code.
E N D
Uvod • Keil C je jedno proširenje ANSI C-a i sastoji se od: • Memorijskih tipova i oblasti u 8051 • Memorijski modeli • Podrška za bit adresibilne lokacije • Podrška za SFR • Atributi funkcija
Keil C - code • Specificiranje lokacije u programskoj memoriji vrši se dodavanjem riječi code, npr.: • Char code tekst[]=˝tekst u code memomotiji˝ • Programska momorija je samo za čitanje i na ovaj način je moguće pristupiti čitavom adresnom prostoru 64KB
Keil C - data • Sa data se definiše promjenljiva u prvih 128 KB memorije: • char data x; • Sa idata se definiše promjenljiva u okviru svih 256 KB interne memorije kojoj se pristupa indirektno: • char idata y,z; • Sa bdata se definiše promjenljiva u okviru bit adresibilnog dijela memorije: • char bdata t;
Keil C - data • Sa xdata specificira se promjenljiva u eksternoj memoriji: • unsigned long xdata vektor[100]; • Sa pdata specificira se jedna stranica od 256 B u eksternoj memoriji: • char pdata vektor1[10][4][4];
Keil C - SFR • Za definisanje SFR koriste se: sfr, sfr16 i sbit. • Sa sfr se definiše određeni 8-bitni sfr: • sfr P0 = 0x80; • Sa sfr16 definiše se lokacija od dva 8 bitna SFR: • sfr16 DP = 0x82 (DPL=0x82 i DPH=0x83) • Sa sbit se definišu promjenljive koje referišu na bite u sfr: • sbit P01 = P0^1; • sbit P01 = 0x81; • sbit P01 = 0x80^1;
Keil C - memorijski modeli • SmallModel • sve promjenljive, svi objekti i stek su u internoj memoriji • CompactModel • sve promjenljive su smještene u jednoj stranici eksterne memorije • sporiji je od prethodnog • LargeModel • sve promjenljive su smještene u eksternoj memoriji • sporiji i manje efikasan od prethodnih • generiše se više koda
Keil C - pokazivači • U keil C - u se mogu specificirati pokazivači na određeni memorijski prostor: • char data *str; • int xdata *x; • long code *z;
Keil C - funkcije • Funkcije u Keil C-u imaju jos neke atribute • [povratni_tip] naziv_fje([argumenti])[small|compact|large] [reentrant][interrupt n][using n] • small,compact,large - memorijski model • reentrant - rekurzivne funkcije • interrupt n - interapt rutina • using n - registarska banka koja će se koristiti
Keil C - stek • Stek se u 8051 implementira isključivo u internoj memoriji • Kompajler ga smješta odmah iza promjenljivih • Kompajler za parametre podrazumjeva fiksne momorijske lokacije • Samo se povratna adresa smješta na stek • Prekidne rutine uglavnom koriste druge registarske banke i čuvaju neke registre na steku • Podrazumijevano kompajler proslijeđuje do tri argumenta u registrima
Keil C - parametri • Proslijeđivanje parametara u registrima
Keil C - vraćanje vrijednosti • Vraćanje vrijednosti kroz registre
Keil C - primjeri f-ja • #pragma small /*default small model */extern int calc (char i, int b) large reentrant;extern int func (char i, float f) large;extern void *tcp (char xdata *xp, int ndx) small;int mtest (int i, int y){ /*small model*/ return (i*y + y*i + func(-1, 4.75);}int large_func (int i, int k) large { /*large model*/ return (mtest(i,k) * 2)}
Keil C - using • Korišćenjem using atributa specificira se registarska banka za korišćenje • To podrazumijeva: • čuvanje na steku tekuće banke (rednog broja) • setovanje nove banke i • restauriranje stare banke • Ne može se koristiti kada se vrijednost vraća u registrima
Keil C - prekidna rutina • Primjer: void timer0 (void) interrupt 1 using 2 { if (++interruptcnt == 4000){ second++; Interruptcnt=0; }} • interrupt prihvata broj koji predstavlja broj prekida • Generiše se sledeći kod: • kada je potrebno na steku se čuvaju ACC, B, DPH, DPL i PSW • ako se ne specificira banka svi korišćeni registri se čuvaju na steku • sve što je čuvano se vraća prije izlaska i funkcija se završava sa TRI
Keil C - reentrant • reentrant funkcije mogu biti pozivane od simultanih procesa • Tako treba da da su definisane sve funkcije koje se pozivaju u prekidnoj rutini i u glavnom programu ili drugoj prekidnoj rutini • reentrant funkcije mogu da se pozivaju rekurzivno
Keil C - reentrant • Za svaku reentrant funkciju se simulira reentrant stek prostor u internoj ili eksternoj memoriji • Za reentrant funkcije postoje sledeća pravila: • bit-ni argumenti i lokalne promjenljive ne mogu biti korišćeni • mogu imati druge atribute (interrupt i using) • povratna adresa smješta se na hardverski stek
Keil C - direktive • Mogu da se zadaju kroz komandnu liniju navođenjem iza naziva fajla ili u samom fajlu navođenjem iza #pragma • #pragma small
Keil C - opcije • Opcije za generisanje koda: • OPTIMIZE(SIZE) - česte operacije zamijenjuje funkcijama i tako smanjuje veličinu koda • NOAREGS - kompajler neće koristiti apsolutni pristup registrima - program će biti nezavisan od korišćene registarske banke • NOREGPARAMS - parametri će se uvijek proslijeđivati u lokalnom mem prostoru