Programare

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Mai exact, ce inseamna prioritatea unei intreruperi? Ce se intampla daca in cursul procesarii unei intreruperi apare alta intrerupere (din alta sursa) si ce influenta are prioritatea asupra a ce se intampla?
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
Depinde de implementare. În unele procesoare/sisteme, o întrerupere cu prioritate mare poate să oprească handling-ul unei întreruperi de prioritate scăzută (și va continua după ce s-a terminat cu aia de prioritate mare). În altele se face o codă de handling atunci când apar întreruperi în timpul altei întreruperi, și se lasă handler-ul curent să termine, dar dacă între timp apar întreruperi de prioritate mare se bagă în față în coadă (așa funcționează de obicei OS-urile desktop). Trebuie să citești documentația pentru sistemul tău embedded ca să vezi cum face exact.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Bai, am o problema... ciudata. :what:
Se da bucata asta de program:
Code:
void functie(unsigned long int numar){ /* afiseaza numarul */ }
...mai jos...
unsigned char x;
x=0;
functie(x); // Aici se afiseasza o aberatie.
Aberatia consta in faptul ca se afiseaza un numar mai mare decat maximul posibil cu char. Sa fie cumva din cauza ca numar e mai lung si raman de undeva niste biti aiurea in continuarea celor 8 de la x? Daca da, cum fac sa trimit un numar mai scurt unei functii care proceseaza tot felul de numere? Si de ce n-am o avertizare la compilare?
 
Last edited:

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
În mod normal ar trebui să facă un cast automat de la char la long, da' poate se zăpăcește la ceva. Aici depinde 100% de compilator ce se întâmplă. Cast-ul ar trebui să facă inclusiv fill cu zerouri ca să-ți dea aceeași valoare, dar cu char-uri poate fi mai dubios.

Cum afișezi numărul, mai exact? Dă toată funcția.
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Sigur nu te oripilezi? :biggrin:
Code:
char  dec[10];    //String to store decimal conversion. Least significant digit is index 0.
char int2dec(unsigned long num){    //Human readable conversion from long int. Return value is most significant non-zero character.
    dec[9]=num/1000000000+48;
    dec[8]=(num%1000000000)/100000000+48;
    dec[7]=(num%100000000)/10000000+48;
    dec[6]=(num%10000000)/1000000+48;
    dec[5]=(num%1000000)/100000+48;
    dec[4]=(num%100000)/10000+48;
    dec[3]=(num%10000)/1000+48;
    dec[2]=(num%1000)/100+48;
    dec[1]=(num%100)/10+48;
    dec[0]=num%10+48;
    signed char i=9;
    while((dec[i]==48) & (i>0)) i--;
    return(i);}
 

miahi

Wizzard
Sugar daddy
Joined
Aug 1, 2004
Location
Unreal Estate, Ankh-Morpork, Discworld
Văd gunoi zilnic, și nu e ca și cum ai face vreodată ce ți se spune (sprintf), deci mă așteptam :biggrin:.

Partea interesantă aici e că de fapt codul ăla, așa abominabil cum e, e ok ca și cod C, chiar îți pune valori corecte în dec. Faptul că nu merge la tine e probabil legat de compilator sau altceva de pe lângă. Ia vezi tu sizeof(num) și cum arată num atunci când îl primește funcția. Of course, în seriala pe care nu vrei s-o folosești, că alt i/o de încredere nu ai :frown:.
 

Thor

Membru Senior
Sugar daddy
Joined
Dec 6, 2004
Location
/dev/null
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Pe seriala am output-ul, dar ajunge acolo dupa inca niste operatii, ca display-ul nu merge cum trebuie dar functiile le-am scris ca si cand ar afisa pe display.
Ce-i ala sizeof() ? N-am si nu vreau sa #include nimic. :zbang:

Deci in concluzie, problema nu-i de la char=>long. Trebuie sa caut altundeva.
Culmea e ca un cod de test luat separat de restul programului scoate ce trebuie. :capu: Si chiar si in cadrul programului, unele numere scoase prin functia asta ies bine, altele nu, si e vorba de numere din aceeasi matrice initializata cu char numere[16]={0,0,0,...} :insane:
 

Thor

Membru Senior
Sugar daddy
Joined
Dec 6, 2004
Location
/dev/null
sizeof() îl implementezi ca un macro:
Code:
#define my_sizeof(type) (char *)(&type+1)-(char*)(&type)
Ai văzut link-ul de mai sus? Printezi char sau int acolo unde afişează aiurea?
 

Marius '95

Membru Senior
Sugar daddy
Joined
Nov 13, 2005
Location
Brăila
Toate sunt char sau short. Nu l-am folosit nicaieri pentru long.
O sa studiez link-ul, dar n-am timp acum ca ma asteapta niste spermograme la termostat.
 
Top Bottom