avr-gcc ignoruje volatile?

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

avr-gcc ignoruje volatile?

Príspevok od používateľa 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.
0
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;}}

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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 
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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?
0
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;}}

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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.
0
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;}}

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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) 31 stiahnutí
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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...
0
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;}}

Používateľov profilový obrázok
bobo87
Ultimate člen
Ultimate člen
Príspevky: 1913
Dátum registrácie: 15 Feb 2007, 00:00
Vek: 36
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa 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:
0
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;}}

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: avr-gcc ignoruje volatile?

Príspevok od používateľa peterple » 14 Máj 2017, 17:05

Vidíš, to ma nenapadlo. Fajn že si dal info čo bolo vo veci.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď