simplex Postat Decembrie 7, 2011 Partajează Postat Decembrie 7, 2011 Nu pot rula pas cu pas un program C in AVR Studio 4.19 Am incercat sa rulez mai multe coduri luate de pe internet pe AVR Studio 4.19 cu compilator de C. Unul din teste a fost programul acesta: #include <math.h>float a, b, d, e, p, r;int main(){ // 165 Cycle Countera=1.2456; // sageata galbena a debuggerului sare peste aceasta instructiuneb=1.1328; // 177 Cycle Countere=exp(b); // 189 Cycle Counter (doar 12 tacti pentru calcularea unei exponentiale !!)p=b*a; // 201d=a/b; // 213r=sqrt(b); // 225} // 237 Cycle CounterAm avut surpriza sa vad sageata galbena a debuggerului sarind peste instructiunea a=1.2456; iar exponentiala, produsul, raportul si radicalul terminindu-se toate dupa 12 tacti, ceea ce da de gindit. Dupa unele documentari suplimentare am constatat ca in realitate compilatorul face niste optimizari si calculeaza dinainte valorile lui e, p, d si r, inglobindu-le in fisierul hex care trebuie incarcat in memoria AVR-ului, astfel incit acesta, cind vine vremea rularii programului, doar ia din memoria sa valorile precalculate pentru cele patru "variabile". Pentru a impiedeca compilatorul sa mai faca optimizari am citit ca trebuie folosita optiunea -O0 ( AVR Studio 4.19 / Project / Configuration Options / General / Optimization: -O0 ) sau declarata una din variabilele a, b de tip volatile float nu float simplu. Am incercat ambele variante insa apare o noua problema, sageata galbena a debuggerului dispare imediat dupa linia e=exp(b); Intrebare: Stie cineva o procedura (setari suplimentare, etc.) care sa determine debuggerul lui AVR Studio 4.19 sa ruleze instructiunile una dupa alta, fara a precalcula valori, adica sageata galbena sa se deplaseze secvential de la linie la linie iar parametrul Cycle Counter sa indice citi tacti au fost necesari pentru executia fiecarei instructiuni. Optimizorul, asa cum este presetat in AVR Studio 4.19, face depanarea programelor foarte dificila, aproape imposibila pentru coduri complicate. Link spre comentariu
godFather89 Postat Decembrie 8, 2011 Partajează Postat Decembrie 8, 2011 Compilat si rulat cu ajutorul AVR Studio 5. Fara optimizari (in dreptul fiecarei linii este valoarea contorului de ciclii inainte de executia liniei): #include <avr/io.h>volatile float a, b, d, e, p, r;int main(void){//CC = 246 a=1.2456; //CC = 252 b=1.1328; //CC = 264 e=exp(b); //CC = 276 p=b*a; //CC = 4026 d=a/b; //CC = 6077 r=sqrt(b); //CC = 7455 while(1); //CC = 7953} Cu optimizari (de compilator, desi nu prea are ce), numarul total de ciclii (pana la while) este de 7936. Nu stiu cat ai mai lucrat tu in embedded dar vad ca nu stii despre volatile. Fara volatile, toate valorile de mai sus erau cunoscute in momentul compilarii si puteau fi calculate de catre compilator pentru a imbunatatii timpul rularii. De altfel, variabilele nu sunt folosite nicaieri in program (doar cateva operatii care nu influenteaza nici cum programul) deci sunt inutile asa ca, compilatorul decidea sa le indeparteze complet. Daca tot vrei sa testezi diferite platforme pentru viteza, iti recomand sa faci un programel adevarat si sa lasi optimizarile pornite. Pentru ca si faptul ca un compilator optimizeaza codul mai bine ca altul este un avantaj al acelei platforme. Link spre comentariu
simplex Postat Decembrie 8, 2011 Autor Partajează Postat Decembrie 8, 2011 Multumesc pentru test. Se pare ca acest AVR Studio 4.19 pe care l-am instalat eu zilele trecute are ceva erori de afisare. Am rulat cu el programul executat pe AVR Studio 5, exact in varianta ta (cu volatile float) dar la instructiunea "e=exp(b)" sageata galbena dispare, la fel ca inainte. Link spre comentariu
nr4 Postat Decembrie 8, 2011 Partajează Postat Decembrie 8, 2011 Am rulat codul din postul lui godFather89 cu AVR Studio 4.18 si am obtinut 7968 de ciclii. Link spre comentariu
godFather89 Postat Decembrie 8, 2011 Partajează Postat Decembrie 8, 2011 Multumesc pentru test. Se pare ca acest AVR Studio 4.19 pe care l-am instalat eu zilele trecute are ceva erori de afisare. Am rulat cu el programul executat pe AVR Studio 5, exact in varianta ta (cu volatile float) dar la instructiunea "e=exp(b)" sageata galbena dispare, la fel ca inainte.Nu stiu ce sa zic... mie imi merge. Cand e sageata la insructiunea aceea ce dai? Step over sau step into? Cum e compilat? Release sau Debug? Link spre comentariu
simplex Postat Decembrie 9, 2011 Autor Partajează Postat Decembrie 9, 2011 Cand e sageata la insructiunea aceea ce dai? Step over sau step into?Dadeam Step Into (F11). Dupa ce ti-am citit mesajul am folosit Step Over (F10) si acum sageata galbena nu mai dispare, trece frumos de la o linie la alta.Am mai remarcat ca daca am dat Step Into si sageata dispare (dar nu imi este foarte clar unde se duce) o pot face sa revina cu ajutorul lui Step Out (Shift F11). Intrebare: AVR Studio 5 se comporta la fel in ceea ce priveste comenzile Step Into, Over si Out? Link spre comentariu
godFather89 Postat Decembrie 9, 2011 Partajează Postat Decembrie 9, 2011 Inseamna ca se ducea cu sageata in locul unde este definita functia aia (deci ar trebui sa vezi sageata in disassembly). Cam toate debugger-ele ar trebui sa se compoarte la fel in situatia asta. Link spre comentariu
simplex Postat Decembrie 9, 2011 Autor Partajează Postat Decembrie 9, 2011 Inseamna ca se ducea cu sageata in locul unde este definita functia aia (deci ar trebui sa vezi sageata in disassembly).Intr-adevar sageata se duce in fereastra "Disassembler" dar intr-un loc unde scrie "File not found" iar actiunea sa nu prea este de mare ajutor pentru depanarea programului.Disassembler windowe=exp(p); -> LDS R22,0x020C //sageata nu se duce aici LDS R23,0x020D LDS R24,0x020E LDS R25,0x020F CALL 0x00000553 STS 0x021E,R22 STS 0x021F,R23 STS 0x0000,R24 STS 0x0221,R25Disassembler window1075: File not found-> LDI R26,0x18 // aici merge sageataLDI R27,0x00 LDI R30,0x77 LDI R31,0x02 JMP 0x0000051FPoate ca este logic ca sageata sa se deplaseze acolo unde se duce dar ar fi totusi necesara o avertizare ca sa stiu unde a disparut cursorul. Link spre comentariu
godFather89 Postat Decembrie 9, 2011 Partajează Postat Decembrie 9, 2011 Daca ar avea codul C al functiei exp, s-ar duce la codul acela. Neavandu-l, se duce la codul assembly luat din biblioteca cu pricina.Mie imi da un mesaj ca nu are codul si daca vreau sa vad disassembly window. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum