Sari la conținut
ELFORUM - Forumul electronistilor

Arduino & PROGMEM - date eronate


informer

Postări Recomandate

Am scris un program care foloseste un numar relativ mare de array-uri de byte si int.

Am folosit PROGMEM pt. a incarca aceste array-uri in flash.

 

post-220246-0-41304900-1443262145_thumb.png

 

Intampin o problema care mi se pare ciudata si pt. care nu gasesc o explicatie.

 

Dupa cum se poate vedea in poza de mai jos, daca incarc direct cu o valoare o variabila index cu ajutorul careia selectez array-urile dorite, totul functioneaza fara probleme iar marimea codului compilat apare aprox. 6.5kB (ceea ce e ciudat pt. ca array-urile mele au numai ele mai mult de atat... dar MERGE fara probleme.).

 

post-220246-0-30929900-1443261884_thumb.jpg

 

Daca in schimb incerc sa incarc acea variabila dintr-o functie banala (al carui rezultat returnat ESTE valoarea din prima imagine, am testat!) brusc marimea codului compilat sare la aprox. 28,5kB iar ceea ce se citeste sunt valori gresite (multe dintre ele fiind 0xFF sau 0xFFFF, ca si cand ar fi citite dintr-o zona gresita). Functia aceea e chiar triviala, functioneaza si nu justifica nicicum diferenta de marime a codului compilat.

 

post-220246-0-23353500-1443261911_thumb.jpg

 

Aceasta este singura diferenta intre cele doua versiuni ale codului!

 

Va sunt recunoscator pt. orice sugestie.

Multumesc! 

 

Link spre comentariu
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • informer

    2

  • Bandi Szasz

    1

Zile populare

Top autori în acest subiect

Imagini postate

Cand ii dai valoarea directa la 22, compilatorul in momentul compilarii vede ca functia "SelectProgram" nu este folosita prin urmare nu-l compileaza findca ar fii degeaba. In momentul in care il apelezi compilaotrul trebuie sa compileze si functia respectiva si probabil functia si datele pe care le foloseste sunt 20kb.

 

Esti sigur ca "SelectProgram" returneaza o valoare corecta ? De obicei date eronate/gresite din array-uri se obtin in cazul in care vrei sa citesi o pozitie inexistenta, poate acea functie returneaza valori gresite si prin urmare se obtine o citire in afara array-ului. Fara un cod complet nu pot sa te ajut mai mult.

Editat de bandi12
Link spre comentariu

Cand ii dai valoarea directa la 22, compilatorul in momentul compilarii vede ca functia "SelectProgram" nu este folosita prin urmare nu-l compileaza findca ar fii degeaba. In momentul in care il apelezi compilaotrul trebuie sa compileze si functia respectiva si probabil functia si datele pe care le foloseste sunt 20kb.

Bandi, ai dreptate cu functia, probabil n-o compileaza insa functia in cauza este foarte mica, nu justifica diferenta.

Dar ai dreptate si pe de o alta parte: daca dadeam o valoare fixa index-ului nu se uploada decat array-ul cu indexul respectiv in locul tuturor celor 30 de array-uri... iar alea "faceau diferenta" :)

In plus, era gresita secventa de citire d-aia imi citea aberatii, corect e asa:

 

  nrRepetari = pgm_read_byte((uint8_t*)pgm_read_word(&(nrRepetari_table[currentPrg])));
  for(i = 0 ; i < nrRepetari ; i++) {
    turatie_motor_0 = pgm_read_byte((uint8_t*)pgm_read_word(&(turatie_motor_0_table[currentPrg])) + i);
    turatie_motor_1 = pgm_read_byte((uint8_t*)pgm_read_word(&(turatie_motor_1_table[currentPrg])) + i);
    pozitie_X       = pgm_read_word((uint16_t*)pgm_read_word(&(pozitie_X_table[currentPrg])) + i);
    pozitie_Z       = pgm_read_word((uint16_t*)pgm_read_word(&(pozitie_Z_table[currentPrg])) + i);
    pozitie_S       = pgm_read_word((uint16_t*)pgm_read_word(&(pozitie_S_table[currentPrg])) + i);
    temporizare0    = pgm_read_word((uint16_t*)pgm_read_word(&(temporizare0_table[currentPrg])) + i);
    temporizare2    = pgm_read_word((uint16_t*)pgm_read_word(&(temporizare2_table[currentPrg])) + i);
  }
Editat de informer
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări