Jump to content
ELFORUM - Forumul Electronistilor
Sign in to follow this  
Guest _zc

MPLAB C30

Recommended Posts

Guest _zc

am un proiect cu mai multe mai multe fisiere sursa. cum trebuie sa declar o variabila intr-un fisier ca sa fie vazuta si in celelalte fisiere?in afara de varianta asta:fisier1int x;fisier2extern int x;

Share this post


Link to post
Share on other sites

aceeasi varianta o folosesc si eu, si nu am avut probleme pana acum1. Trebuie sa ai grija ca variabila x sa fie declarata globala (nu in interiorul unei functii)2. Ambele fisiere trebuie incluse in proiect3. Fisierul pt linker (cu extensia .gld) trebuie inclus in proiect

Share this post


Link to post
Share on other sites
Guest _zc

merge, merge nu-i problema.dar ma gindeam daca se poate si altfel sa nu o mai declar extern.. in fiecare fisier unde o folosesc. de exemplu am o structura de biti unde tin semnalizari de la seriala,i2c....trebuie sa declar extern.. structura asta in fiecare fisier unde folosesc unul din biti. daca mai adaug un bit sau modific ceva la ea trebuie sa am grija sa modific peste tot.

Share this post


Link to post
Share on other sites

merge, merge nu-i problema.dar ma gindeam daca se poate si altfel sa nu o mai declar extern.. in fiecare fisier unde o folosesc. de exemplu am o structura de biti unde tin semnalizari de la seriala,i2c....trebuie sa declar extern.. structura asta in fiecare fisier unde folosesc unul din biti. daca mai adaug un bit sau modific ceva la ea trebuie sa am grija sa modific peste tot.

typedef struct {.....} mystruct -> asta intr-un header;mystruct x; -> in fisierul in care o definestiextern mystruct x; -> in toate celelalte fisiere unde o folosesti, incluzand mai intai header-ul.

Share this post


Link to post
Share on other sites

Eu zic ca o solutie este ca "modulele" sa nu fie... aware de structura de bit la nivelul declaratiei. Adica le vei declara byte sau word sau ce o fi, dar le "apelezi" dupa structura comuna, fiecare modul fiind "constient" de partea care-i revine. Un pic de ajutor ar fi sa structurezi/grupezi bitii dupa utilizare.Pe de alta parte, parca si tipurile pot fi declarate global. Caz in care structura unei variabile particulare va fi cunoscuta in orice modul. Am zis "parca", nu dati cu parul.

Share this post


Link to post
Share on other sites

Guest _zc

da bogdanm, asa se mai simplifica.abram_burel nu pricep ce vrei sa zici. am grupat toti bitii aia din obisnuinta, sa nu consum ram inutil, cu toate ca la dspic nu mai conteaza citiva octeti consumati in plus

Share this post


Link to post
Share on other sites

Pai cam exact ce zicea bogdan, dar consideratiile erau valabile pentru un limbaj oarecare si exprimate e drept cam.. intortocheat.Ar mai fi o varianta, folosita in asm: sa lasi cuvantul ala de stare nestructurat (adica sa nu definesti structura asa cum a propus bogdan) si sa folosesti masti pentru testarea/modificarea bitilor, acolo unde ai nevoie. Oricum, nu prea ar avea rost, s-ar pierde din facilitatile unui limbaj de nivel mai inalt (desi codul ar putea sa iasa mai compact).

Share this post


Link to post
Share on other sites

Poti impaca (oarecum) si capra si varza folosind niste uniuni:

 

struct sixteen_bits{	unsigned char bit0	:1;	unsigned char bit1	:1;	unsigned char bit2	:1;	unsigned char bit3	:1;	unsigned char bit4	:1;	unsigned char bit5	:1;	unsigned char bit6	:1;	unsigned char bit7	:1;	unsigned char bit8	:1;	unsigned char bit9	:1;	unsigned char bit10	:1;	unsigned char bit11	:1;	unsigned char bit12	:1;	unsigned char bit13	:1;	unsigned char bit14	:1;	unsigned char bit15	:1;};struct eight_bits{	unsigned char bit0	:1;	unsigned char bit1	:1;	unsigned char bit2	:1;	unsigned char bit3	:1;	unsigned char bit4	:1;	unsigned char bit5	:1;	unsigned char bit6	:1;	unsigned char bit7	:1;};struct two_bytes{	unsigned char low;	unsigned char high;};union wordtype{	unsigned int word;	struct two_bytes byte;	struct sixteen_bits part;};union chartype{	unsigned char byte;	struct eight_bits part;};// eventual cu un typedef, sa fie mai usor la declaratii dupa aceeawordtype a;// acces pe cuvant de 16 biti:a.word=0xFFFF;// acces pe octet:a.byte.low &= MASK;a.byte.high = 0xAB;// acces pe biti:a.part.bit5 = 1;// in toate cazurile continutul accesat este acelasi, doar modul de acces difera.

In felul asta poti accesa aceiasi biti fie individual, fie direct ca octet sau cuvant pe 16 biti.

 

In rest, dupa cum zicea si bogdanm, definitiile structurilor/uniunilor intr-un header care este inclus de toate fisierele/modulele ce vor utiliza respectivele structuri/uniuni (in acest mod trebuie sa modifici doar intr-un singur loc definitia), iar declaratiile - intr-un modul in mod normal, in restul cu extern (desigur, in caz ca se doreste accesarea aceluiasi obiect din diverse module).

Share this post


Link to post
Share on other sites
Guest _zc

cu asta m-am lamurit, va multumesc.

Share this post


Link to post
Share on other sites
Guest _zc

cum definesti/scrii/citesti structuri in eepromul intern? daca se poate.si inca ceva: eepromul intern nu reusesc sa-l scriu decit daca il sterg inainte. scrie undeva treaba asta.

Share this post


Link to post
Share on other sites

cum definesti/scrii/citesti structuri in eepromul intern? daca se poate.si inca ceva: eepromul intern nu reusesc sa-l scriu decit daca il sterg inainte. scrie undeva treaba asta.

In GCC nu merge direct. Adica merge doar sa-i specifici faptul ca structura se afla fizic in EEPROM, dar tot va trebui sa folosesti eeprom_read/eeprom_write ca sa ai acces la membrii ei. Tinand cont de faptul ca aici apar probleme de alignment, e mai bine s-o lasi balta daca nu stii foarte clar ce faci. E posibil ca alte compilatoare sa suporte asta. Stiu sigur ca IAR te lasa sa spui "__eeprom int x" (de exemplu) si apoi poti accesa x direct, fara sa fie nevoie sa folosesti functii de acces.Orice memorie flash/EEPROM trebuie stearsa inainte de a fi scrisa. Asta pentru ca singura operatie prin care poti "scrie" un 1 intr-o astfel de memorie e stergerea. Daca un 1 din asta devine 0 printr-o operatie normala de scriere, nu mai poate fi facut 1 din nou decat prin stergere. Nu scrie in manual pentru ca se presupune ca lumea stie chestia asta :)

Share this post


Link to post
Share on other sites
Guest _zc

bogdanm vad ca ai raspuns. dar e o problema ca eu nu vad decit pina la post-ul meu din 12 mai.daca ai raspuns inseamna ca tu vezi tot topicul

Share this post


Link to post
Share on other sites

Dap, eu vad tot topic-ul, de asta am si sters ultimul tau post. E ciudat rau ca vezi numai o parte din post-uri.

Share this post


Link to post
Share on other sites
Guest _zc

gata acum vad tot.deci nu merge faza cu structuri in eeprom. asta e. din eeproamele cu care am lucrat asta e singurul care are stergerea explicita.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.