Upravljanje stekom i graf poziva funkcija
Stek kod PIC mikrokontrolera je ograničene veličine i ne može se njime direktno manipulisati. Na programeru je da proveri da se nije desilo prekoračenje u maksimalnoj dubina steka. Graf poziva funkcija je obezbeđen od strane linkera, pri generisanju MAP fajla, i prikazuje nivo steka, pri svakom pozivu funkcije.
Struktura grafa poziva funkicija
* _function_name size p,a offset o
Zvezdica * ispred naziva nekih funkcija označava da se ova funkcija nalazi na kritičnoj putanji i da je sama kritična. Ukoliko je neophodno smanjiti količinu utrošenog RAM-a potrebno je znati da modifikovanje funkcija koje nisu označene zvezdicom neće se ništa postići, jer one ne utiču na ukupnu količinu zauzetog RAM-a. Modifikovanje funkcija označenih zvezdicom može doprineti smanjenju ukupnog utroška RAM-a, ali to onda može dovesti do toga da neke druge funkcije postanu kritične
Objašnjenje: Termin kritična funkcija označava funkciju koja mora da zauzme neku memorijsku lokaciju za svoje lokalne promenljive i argumente. Ne kritična funkcija deli memorijske lokacije, za lokalne promenljive i argumente, sa nekim drugim kritičnim i/ili nekritičnim funkcijama, jer se korišćenje tih lokacija nikad neće preklopiti pa je tako nešto moguće.
_function_name
Predstavlja naziv funkcije sa dodatom donjom crtom ispred imena.
size p,a
Broj p predstavlja broj bajtova koje zauzimaju lokalne promenljive, dok broj a predstavlja broj bajtova koje zauzimaju argumenti funkcije.
offset o
Broj o predstavlja rastojanje u RAM-u od kojeg počinje alociranje memorije za potrebe funkcije. Rastojanje se posmatra od osnove lokalnog bloka RAM-a, pozicija ovog bloka se može videti u sekciji common MAP fajla odmah posle listinga fajlova.
INDIRECT ####
Predstavlja sve funkcije koje se pozivaju indirektno preko oznake ####. Pošto je ovaj sistem zasnovan na oznakama, ako imate dve grupe funkcija koje se pozivaju indirektno na dva različita mesta, a imaju iste oznake, onda će se funkcije iz obe grupe prikazati da su pozvane sa oba mesta.
->
Simbol “->” se pojavljuje kada u grafu poziva postoji funkcija koja nema lokalnih promenljivih i argumenata, a poziva druge funkcije. To je samo skraćenica za graf poziva, koja sprečava da se jako proširi i postane nepregledan, sa karakterima za dodatno uvlačenje reda. Koristi se na sledeći način:
_func1 -> func2 size p,a offset o
Primer grafa poziva funkcija
Kreirajmo jednostavan projekat u kojem ćemo prikazati neke funkcije i njihove pozive i na osnovu tog koda generisani graf poziva funkcija.
#include <pic.h>
void func01(void);
void func02(char ch);
void func03(char ch,int i);
void func04(char c);
void func05(void);
void main(void) {
unsigned char t;
void (* fptr)(char);
t=17;
func01();
func02(5);
func04(t);
func05();
fptr=func02;
fptr(15);
}
void func01(void) {
// add some code here
// ...
}
void func02(char ch) {
func03(ch,18);
func01();
// add some code here
// ...
}
void func03(char ch,int i) {
volatile unsigned char temp;
temp = 1;
// add some code here
// ...
}
void func04(char c) {
unsigned char t;
t = c;
func03(c,t);
}
void func05() {
func02(3);
}
Izgled grafa poziva funkcija za prethodni kod dat je u nastavku:
*_main size 0,3 offset 0
_func01
* _func02 size 0,1 offset 3
* _func03 size 2,1 offset 5
_func01
* _func04 size 0,2 offset 3
* _func03 size 2,1 offset 5
* _func05->_func02 size 0,1 offset 3
* _func03 size 2,1 offset 5
_func01
string_table
* INDIRECT 4216
* INDIRECT 4216
* _func02 size 0,1 offset 3
* _func03 size 2,1 offset 5
_func01
Leave your response!
You must be logged in to post a comment.