Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • avr-gcc ignoruje volatile?

avr-gcc ignoruje volatile?

C,C++,C#

Moderátori: psichac, Moderátori

avr-gcc ignoruje volatile?

Odosla┼ąod bobo87 » 22 Apr 2017, 22:36

Zdravim, mam podozrenie na to, ze avr-gcc (4.8.2) ma bug v jednom pripade pouzitia volatile. Ma niekto iny napad co som mohol prehliadnut a sposobuje to moj problem? Mam zapojenie, v ktorom je ATmega128A, XTAL 8MHz, na PORTC je zavesenych 8 LED.

Testovaci program je tu : https://pastebin.com/197Q3c6p

Pokusne som si chcel nechat vysvietit hodnotu systemTimer na PORTC, ale akosi sa nedeje nic, vsetky LED zhasnute. Zapojenie je OK, ak sa hodnota na PORTC nastavi natvrdo, LED svietia ako maju. Ak som skusil zmenit ISR priamo na manipulaciu s portom, napr:

K├│d: Vybra┼ą v┼íetko
ISR(TIMER1_COMPA_vect){
    PORTC = ~PORTC;
}


a slucku v main() som upravil na
K├│d: Vybra┼ą v┼íetko
while(1){
    ;
}


tak v 1s intervaloch sa LED pekne vypinaju a zapinaju, taze casovac je urcite nastaveny OK. Vychadza mi to, ze v main() v loope kompilator necita realnu hodnotu systemTimer, ale pouziva stale hodnotu 0 z inicializacie. Je to tou vecernou hodinou, alebo uslo nieco mne, alebo je to naozaj bug kompilatora?

EDIT:
Ak som deklaraciu systemTime zmenil na:
K├│d: Vybra┼ą v┼íetko
register Time systemTime asm("r3");

tak sa to tvari funkcne, ale takto by to byt nemalo. + Program sa sprava inak pri zapnutych/vypnutych optimalizaciach.
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
bobo87
Obr├ízok pou┼ż├şvate─ża
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1774
Vek: 30.01
Zalo┼żen├Ż: 15.02.2007
Bydlisko: Košice
Karma: 7

Re: avr-gcc ignoruje volatile?

Odosla┼ąod peterple » 22 Apr 2017, 22:54

Skompiloval som to a kukol na to ako je to prelo┼żen├ę. A z poh─żadu kompil├ítora je to OK. Premenn├í s├şdli v SRAM a je v main korektne ─Ź├ştan├í. Tak┼że bug v kompil├ítore hl├ísi┼ą nemus├ş┼í.
Version: 3.4.0.663 - GCC 4.6.2

K├│d: Vybra┼ą v┼íetko
ISR(TIMER1_COMPA_vect){
0000002F  PUSH R1      Push register on stack
00000030  PUSH R0      Push register on stack
00000031  IN R0,0x3F      In from I/O location
00000032  PUSH R0      Push register on stack
00000033  CLR R1      Clear Register
00000034  PUSH R24      Push register on stack
   systemTime++;
00000035  LDS R24,0x0060      Load direct from data space
00000037  SUBI R24,0xFF      Subtract immediate
00000038  STS 0x0060,R24      Store direct to data space
}
0000003A  POP R24      Pop register from stack
0000003B  POP R0      Pop register from stack
0000003C  OUT 0x3F,R0      Out to I/O location
0000003D  POP R0      Pop register from stack
0000003E  POP R1      Pop register from stack
0000003F  RETI       Interrupt return


K├│d: Vybra┼ą v┼íetko
      PORTC = systemTime;
0000004F  LDS R24,0x0060      Load direct from data space
00000051  OUT 0x15,R24      Out to I/O location
00000052  RJMP PC-0x0003      Relative jump
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1522
Vek: 50.99
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 43

Re: avr-gcc ignoruje volatile?

Odosla┼ąod bobo87 » 22 Apr 2017, 22:57

Hlasit to zatial nehlasim, ale nerozumiem preco tomu tak je a preco ak tu premennu napasujem priamo do registra, tvari sa to OK? +preco to funguje inak pri optimalizaciach? Jednoducho mi nejako unika, PRECO je to tak?
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
bobo87
Obr├ízok pou┼ż├şvate─ża
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1774
Vek: 30.01
Zalo┼żen├Ż: 15.02.2007
Bydlisko: Košice
Karma: 7

Re: avr-gcc ignoruje volatile?

Odosla┼ąod peterple » 22 Apr 2017, 23:09

Nevid├şm nikde probl├ęm. Kompiloval som ten tvoj original program s O1 a potom aj s O3. v┼żdy to bolo rovnak├ę a simul├ícia uk├ízala ┼że to funguje. Tak si to odsimuluj ke─Ć sa ti zd├í ┼że nie─Źo je zle.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1522
Vek: 50.99
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 43

Re: avr-gcc ignoruje volatile?

Odosla┼ąod bobo87 » 22 Apr 2017, 23:14

Skusal som to v simulatore z AtmelStudia 7 a tvarilo sa to OK. Mohol by som ta poprosit o HEX subor, ktory ti to vyplulo? Nech to skusim hodit na HW, co to spravi.
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
bobo87
Obr├ízok pou┼ż├şvate─ża
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1774
Vek: 30.01
Zalo┼żen├Ż: 15.02.2007
Bydlisko: Košice
Karma: 7

Re: avr-gcc ignoruje volatile?

Odosla┼ąod peterple » 23 Apr 2017, 10:59

Tu je hex. V─Źera sm to kompiloval pre ATmega8. Preto s├║ tam pou┼żit├ę zl├ę adresy. Prilo┼żen├Ż s├║bor je u┼ż pre mega128A.
Pr├şlohy
GccApplication2.hex
(721 bajtov) Stiahnutá 7 krát
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1522
Vek: 50.99
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 43

Re: avr-gcc ignoruje volatile?

Odosla┼ąod bobo87 » 23 Apr 2017, 21:28

Ahoj, dakujem. Prave som to dal dnu a - nic... Premyslam, co dalsie by to mohlo byt. ATmega je kupena na eBay, takze predpokladam iba fake, ale moze sa to prejavit takto?

EDIT:
Nieco je asi velmi zle, deju sa tu take podivnosti, ze ak napr priradene tlacidla natvrdo vysvietim v hlavnom cykle v style PORTC = PIND; tak to funguje, ale akonahle PIND je volanie fcie, ktora PIND vracia, nejde to. Tak to som este nevidel...
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
bobo87
Obr├ízok pou┼ż├şvate─ża
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1774
Vek: 30.01
Zalo┼żen├Ż: 15.02.2007
Bydlisko: Košice
Karma: 7

Re: avr-gcc ignoruje volatile?

Odosla┼ąod bobo87 » 12 M├íj 2017, 21:07

Nemal som vela casu, tak az teraz. Riesenie vyzera byt to, ze bol zapnuty mod kompatibility s atmega103 (preto to asi aj slo v simulatore). Takze CLOSED, kazdy sa obcas utne. :applause:
float l,I,Q,_,o;int E;main(){I=1.125;while(I>=-1.225){for(l=-2;l<=1;l+=3/79.0){Q=_=0;for(E=127;Q*Q+_*_<4.0&&--E>32;){o=Q;Q=Q*Q-_*_+l;_=2*o*_+I;}putchar(E);}putchar(10);I-=9/88.0;}}
bobo87
Obr├ízok pou┼ż├şvate─ża
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1774
Vek: 30.01
Zalo┼żen├Ż: 15.02.2007
Bydlisko: Košice
Karma: 7

Re: avr-gcc ignoruje volatile?

Odosla┼ąod peterple » 14 M├íj 2017, 17:05

Vid├ş┼í, to ma nenapadlo. Fajn ┼że si dal info ─Źo bolo vo veci.
Uk├í┼ż m├║dremu chybu a on sa ti po─Ćakuje. Uk├í┼ż chybu hlup├íkovi a on sa uraz├ş.
peterple
Ultimate ─Źlen
Ultimate ─Źlen
Pr├şspevky: 1522
Vek: 50.99
Zalo┼żen├Ż: 25.06.2013
Bydlisko: Krajn├ę
Karma: 43


Nasp├Ą┼ą na C,C++,C#

Kto je pr├ştomn├Ż

U┼ż├şvatelia prezeraj├║ci si toto f├│rum: ┼Żiadny registrovan├Ż pou┼ż├şvate─ż a 2 host├ş.

Forums ©
Autor str├ínky je Ondrej Z├ívodsk├Ż(zawin), o graficky design sa star├í ─Żubo┼í Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
─îas potrebn├Ż k spracovaniu str├ínky 0.08 sek├║nd