Programare

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?
 
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.
 
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:
Î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.
 
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);}
 
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:.
 
 
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:
 
N-am si nu vreau sa #include nimic.
De-aia durează 5 ani să faci o aplicație cât de cât, că trebuie să reinventezi tot, inclusiv trecând prin toate bug-urile pe care le-au rezolvat alții timp de 50 de ani. Dar e ok, așa te asiguri că aplicația e greu de modificat și îți dai ceva de lucru pentru alți 10 ani...
 
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?
 
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.
 
Merge. L-am folosit la job.

Acum: fine tuning. Ma scoate din sarite ca uneori "sare" cate o apasare de buton. Cauza este o intrerupere cu timer la fiecare 125us (8KHz => beep la 4KHz). Acea intrerupere, desi are prioritate mai mica decat intreruperea butoanelor, pe perioada cat e activa, alea nu par sa mearga.
Am incercat sa simplific chestia aia si sa mai mut din ea niste chestii care pot sta in main(). Culmea! Dupa simplificare, dracia face beep pe o frecventa mai JOASA decat inainte! Practic, acum nu "sare" doar intreruperea butoanelor, "sare" si intreruperea timer-ului! :capu:
 
Nu fă beep-ul din software, ci adaugă un circuit care doar asta face, un bip de care vrei tu, când primește un impuls din procesor.
 
Aici intervine discuția de mai sus, ce se întâmplă când ai două întreruperi în același timp; după cum pare, sistemul tău ignoră întreruperea de la butoane când procesează timer-ul, probabil pentru că are prioritate mai mare timer-ul.

Dacă vrei software și să meargă, folosește software până la capăt: generează beep-ul în main (cu delay-uri) și atunci o să fie întrerupt de butoane.
 
Nu are prioritate mai mare. Am fost atent la asta de cand le-am scris.
E foarte dificil sa fac beeper hardware, mai ales ca placa are DAC, amp si speaker conectate de-a gata.
Mai testez...
 
Sigur folosești corect placa? Pentru că de obicei procesoarele mai mari care au DAC-uri and stuff au și module hardware de utilizare a DAC-urilor (cu acces direct la memorie, de unde-și pot lua samples direct, fără să le servești tu fiecare bit - doar setezi zona de memorie cu waveform-ul pe care-l vrei și le zici "cântă asta", iar între timp CPU-ul poate face orice altceva).
 
mcb2130 cu lpc 2138. Google it.
2020-03-05 12.34.38.jpg
 
Back
Top