logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

GCC i dziwne ostrzezenia przy __attribute__

demoh 24 Wrz 2008 17:13 3008 18
  • #1 5567270
    demoh
    Poziom 19  
    Kod kompiluje sie z warning'ami, ale poprawinie. Chcial bym sie tych dodatkow pozbyc. Wczescniej jak ta metoda robilem funkce ktora byla pozniej podpinana jako przerywanie to wszystko bylo ok, a teraz nie :/

    void time_fireInt(void) __attribute__ ((signal));
    
    // Obsluga tykniecia licznika
    void time_fireInt()
    {
    	time_statusRealTick++;
    }


    A otrzymuje takie cos:

    # Kompilacja zrodel
    avr-gcc -Wall -mmcu=atmega88 -c -x assembler-with-cpp -o work/entry.o source/entry.asm
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/init.o source/init.c
    #avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/ir.o source/ir.c
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/led.o source/led.c
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/core.o source/core.c
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/interrupt.o source/interrupt.c
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/engine.o source/engine.c
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/wait.o source/wait.c
    In file included from source/wait.c:12:
    source/time.h:14: warning: ‘time_fireInt’ appears to be a misspelled signal handler
    avr-gcc -Wall -O2 -mmcu=atmega88 -c -std=gnu99 -o work/time.o source/time.c
    In file included from source/time.c:11:
    source/time.h:14: warning: ‘time_fireInt’ appears to be a misspelled signal handler
    # Linkowanie obiektow
    avr-ld -T firmware.ld -nodefaultlibs -nostartfiles  -o binary/firmware.elf work/entry.o work/init.o work/led.o work/core.o work/interrupt.o work/engine.o work/wait.o work/time.o
    # Tworzenie plikow wynikowych
    avr-objcopy -O binary binary/firmware.elf binary/firmware.bin
    avr-objcopy -O ihex binary/firmware.elf binary/firmware.hex
    # Listing rozkazow procesora
    avr-objdump -h -S -z binary/firmware.elf > binary/firmware.ls
    # Rozmiar sekcji
    avr-size binary/firmware.elf
       text	   data	    bss	    dec	    hex	filename
        450	      0	      8	    458	    1ca	binary/firmware.elf
    



    A jedyne o co mi chodzi z attribute by na koncu funkcji byl rozkaz RETI a nie RET :/

    Wie ktos jak to poprawic?
  • #3 5568065
    demoh
    Poziom 19  
    Nie uzywam standardowe biblioteki. Sam pisze wszystko co mi potrzeba. Tylko nad ta jedna rzecza utknalem.

    Robie podobnie jak jest w interrupt.h zdefiniowane ISR ale wywala blad :/
  • #4 5568285
    zumek
    Poziom 39  
    demoh napisał:
    ... Tylko nad ta jedna rzecza utknalem...

    Kompilator również :(
    Nie wiadomo , do jakiego wektora "przypiąć Twoją funkcję.
    
    void TIMER1_OVF_vect() __attribute__ ((signal));
    
    // Obsluga tykniecia licznika
    void TIMER1_OVF_vect() //time_fireInt()
    {
    static char time_statusRealTick=0;  //np.
       time_statusRealTick++;
    }
    

    Teraz już wie ;)

    Piotrek
  • #5 5568487
    GreG$
    Poziom 13  
    być może trzeba wskazać jeszcze sekcję (nie kombinowałem tak nigdy)

    demoh napisał:
    Nie uzywam standardowe biblioteki. Sam pisze wszystko co mi potrzeba. [...]


    Po co? W jakim celu?
    Po co w takim razie w ogóle używasz C? Assembler chyba bardziej by Ci służył..
  • #6 5568503
    demoh
    Poziom 19  
    Niektorzy pisza by pisac, ja pisze by doszlifowac znajomosc jezyka i wszystkiego wokol niego. A ze nieraz cos nie wychodzi to inna historia.

    A co assemblera to za kazdym razem po skompilowaniu sprawdzam listing tego co wygenerowal GCC, nieraz totalne glupoty potrafi wygenerowac :/

    Dodano po 43 [minuty]:

    Znalazlem rozwiazenie :)

    Trzeba nazywac funkcje __vector_1, __vector_2 itd. W tedy nie ma ostrzezenia.

    Troche dziwnie ale jakos obejsc mozna xD
  • #7 5569111
    Freddie Chopin
    Specjalista - Mikrokontrolery
    nie wiem naprawde co w tym dla ciebie dziwnego...

    skoro procesor ma X wetorow przerwan, a ty nazwiesz sobie swoj np zielone_pieski, to skad on ma wiedziec, ze chodzi ci o timer, a nie np o adc? wszystko jest logiczne...

    4\/3!!
  • #8 5569163
    demoh
    Poziom 19  
    Akurat w tym przypadku nie jest logiczne. U mnie nie chodzilo o stworzenie funkcji przerywania i skoku do niej w tablicy wektorow przerywan.

    W tablicy wektorow u mnie sie nic nie zmienia. Jedyne co sie dzieje to rokaz RET w funkcji jest zamieniony przez RETI. Wlasnie o to mi chodzilo.

    Wektory przerywan:
    00000000 <entry>:
       0:	19 c0       	rjmp	.+50     	; 0x34 <entry_stack>
    
    00000002 <entry_int0>:
       2:	18 95       	reti
    
    00000004 <entry_int1>:
       4:	18 95       	reti
    
    00000006 <entry_pcinit0>:
       6:	18 95       	reti
    
    00000008 <entry_pcinit1>:
       8:	18 95       	reti
    
    0000000a <entry_pcinit2>:
       a:	18 95       	reti
    
    0000000c <entry_wdt>:
       c:	18 95       	reti
    
    0000000e <entry_timer2_compa>:
       e:	18 95       	reti
    
    00000010 <entry_timer2_compb>:
      10:	18 95       	reti
    
    00000012 <entry_timer2_ovf>:
      12:	18 95       	reti
    
    00000014 <entry_timer1_capt>:
      14:	18 95       	reti
    
    00000016 <entry_timer1_compa>:
      16:	18 95       	reti
    
    00000018 <entry_timer1_compb>:
      18:	18 95       	reti
    
    0000001a <entry_timer1_ovf>:
      1a:	18 95       	reti
    
    0000001c <entry_timer0_compa>:
      1c:	18 95       	reti
    
    0000001e <entry_timer0_compb>:
      1e:	18 95       	reti
    
    00000020 <entry_timer0_ovf>:
      20:	18 95       	reti
    
    00000022 <entry_spi_stc>:
      22:	18 95       	reti
    
    00000024 <entry_usart_rx>:
      24:	18 95       	reti
    
    00000026 <entry_usart_udre>:
      26:	18 95       	reti
    
    00000028 <entry_usart_tx>:
      28:	18 95       	reti
    
    0000002a <entry_adc>:
      2a:	18 95       	reti
    
    0000002c <entry_ee_ready>:
      2c:	18 95       	reti
    
    0000002e <entry_analog_comp>:
      2e:	18 95       	reti
    
    00000030 <entry_twi>:
      30:	18 95       	reti
    
    00000032 <entry_spm_ready>:
      32:	18 95       	reti


    Wszedzie jest RETI, czyli nie ma obslugi, bede robic recznie, bo w moim przypadku bedzie mi latwiej, nie pytac po co :P


    Funkcja:
    00000168 <__vector_14>:
     168:	1f 92       	push	r1
     16a:	0f 92       	push	r0
     16c:	0f b6       	in	r0, 0x3f	; 63
     16e:	0f 92       	push	r0
     170:	11 24       	eor	r1, r1
     172:	8f 93       	push	r24
     174:	9f 93       	push	r25
     176:	af 93       	push	r26
     178:	bf 93       	push	r27
     17a:	80 91 04 01 	lds	r24, 0x0104
     17e:	90 91 05 01 	lds	r25, 0x0105
     182:	a0 91 06 01 	lds	r26, 0x0106
     186:	b0 91 07 01 	lds	r27, 0x0107
     18a:	01 96       	adiw	r24, 0x01	; 1
     18c:	a1 1d       	adc	r26, r1
     18e:	b1 1d       	adc	r27, r1
     190:	80 93 04 01 	sts	0x0104, r24
     194:	90 93 05 01 	sts	0x0105, r25
     198:	a0 93 06 01 	sts	0x0106, r26
     19c:	b0 93 07 01 	sts	0x0107, r27
     1a0:	bf 91       	pop	r27
     1a2:	af 91       	pop	r26
     1a4:	9f 91       	pop	r25
     1a6:	8f 91       	pop	r24
     1a8:	0f 90       	pop	r0
     1aa:	0f be       	out	0x3f, r0	; 63
     1ac:	0f 90       	pop	r0
     1ae:	1f 90       	pop	r1
     1b0:	18 95       	reti



    A tak ogolnie to sobie zrobilem male makro do przerywan:
    #define _INTERRUPT(_L_VECTOR) void _L_VECTOR(void) __attribute__ ((signal)); void _L_VECTOR(void)
    	
    	#define _INTERRUPT_INT0 __vector_1
    	#define _INTERRUPT_INT1 __vector_2
    	#define _INTERRUPT_PCINIT0 __vector_3
    	#define _INTERRUPT_PCINIT1 __vector_4
    	#define _INTERRUPT_PCINIT2 __vector_5
    	#define _INTERRUPT_WDT __vector_6
    	#define _INTERRUPT_TIMER2_COMPA __vector_7
    	#define _INTERRUPT_TIMER2_COMPB __vector_8
    	#define _INTERRUPT_TIMER2_OVF __vector_9
    	#define _INTERRUPT_TIMER1_CAPT __vector_10
    	#define _INTERRUPT_TIMER1_COMPA __vector_11
    	#define _INTERRUPT_TIMER1_COMPB __vector_12
    	#define _INTERRUPT_TIMER1_OVF __vector_13
    	#define _INTERRUPT_TIMER0_COMPA __vector_14
    	#define _INTERRUPT_TIMER0_COMPB __vector_15
    	#define _INTERRUPT_TIMER0_OVF __vector_16
    	#define _INTERRUPT_SPI_STC __vector_17
    	#define _INTERRUPT_USART_RX __vector_18
    	#define _INTERRUPT_USART_UDRE __vector_19
    	#define _INTERRUPT_USART_TX __vector_20
    	#define _INTERRUPT_ADC __vector_21
    	#define _INTERRUPT_EE_READY __vector_22
    	#define _INTERRUPT_ANALOG_COMP __vector_23
    	#define _INTERRUPT_TWI __vector_24
    	#define _INTERRUPT_SPM_READY __vector_25



    Moze ktos powie ze jestem dziwny, ale dla mnie programowanie to sztuka :) i jak robie cos sam dla siebie to wole to zrobic po swojemu i bez zbetnych dodatkowych rzeczy. Nie lubie uzywac we wlasnych niekomercyjnych projektach rzeczy ktore zostaly napisane przez kogos innego, wole sam do wszystkiego dojsc i zrozumiec :)

    Jednoczesnie umiem uzywac i pisac przy pomocy gotowych bibliotek. Ale tylko jak nie robie dla siebie. Jakos tak mi radosc sprawia jak cos zrobie od poczatku do konca sam i przy okazji naucze sie wielu rzeczy :)

    Dziekuje za pomoc i sugestie :)
  • #9 5569179
    Dr.Vee
    VIP Zasłużony dla elektroda
    Tak, tylko ciekawe czy wtedy Ci AVR nie wywoła tej funkcji przy obsłudze innego przerwania... Niestety żeby coś takiego wykonać trzeba pokopać głębiej niż w pliku nagłówkowym avr/interrupt.h

    Pozdrawiam,
    Dr.Vee
  • #10 5569203
    demoh
    Poziom 19  
    No kurde....

    Chyba nikt nie czyta tego co napisalem ze zrozumieniem....

    Nie uzywam bibliotek z avr/*

    Z tej racji avr/interrupt.h nie wystepuje w moim programie.

    Wektory przerywan mam ustawiane recznie, nie ma bata by cos samo wlazlo. Jak nie dopisze skoku do czegos w czystym assemblerze to poprostu nie bedzie go i tyle.

    Z __attrybute((signal)) chodzilo mi by rozkaz powrotu z funkcji mial byc zastapiony przez rozkaz powrotu z przerywania.
  • #11 5569267
    Dr.Vee
    VIP Zasłużony dla elektroda
    Po prostu zanim kliknąłem "wyślij" to zdążyły się 2 nowe odpowiedzi pojawić.

    Nie pisałem, że używasz #include <avr/interrupt.h>. Ty czytasz definicję makra ISR(...) i przepisujesz jako swoją, wyręczając w tym preprocesor :) A Twoje makra __INTERRUPT(...) zadziałają (tutaj strzelam) np. dla Atmega8, ale dla Atmega128 już pewnie nie.

    "Nie ma bata" tylko wtedy, jeśli używasz własnego skryptu linkera i własnego kodu inicjalizującego uC (crt). Zmiennych globalnych pewnie też nie deklarujesz, tylko piszesz ich inicjalizację w asemblerze :)

    Żeby używać biblioteki nie trzeba wcale dołączać pliku nagłówkowego. Np:
    
    int main(void) {
        int i = atoi("123");
        return 0;
    }

    skompiluje się i zadziała bez problemu.

    Fajnie, że lubisz się urobić po łokcie w niskopoziomowym kodzie. Nie każdy to lubi, ale oczywiście można się wiele nauczyć. Tylko warto wiedzieć gdzie kończy się nauka, a zaczyna syndrom "NIH" (not invented here).

    Pozdrawiam,
    Dr.Vee
  • #12 5569274
    demoh
    Poziom 19  
    Ja wogole w swoim programie main nie mam :P

    Wszystko robie po swojemu i poprostu sie dziwie ze tyle opcji ma GCC a nie ma prostego zamieniania RET na RETI bez uzycia vector'ow :/

    Ale co tam :P najwazniejsze ze teraz dziala :)
  • #13 5569278
    Dr.Vee
    VIP Zasłużony dla elektroda
    Właśnie zauważyłem, że make też nie używasz :)

    No nic, powodzenia w walce z wiatrakami. Jak już skończysz, to może np. wykorzystasz swoją energię do poprawy jakości generacji/optymalizacji kodu przez avr-gcc... Albo może napiszesz własny kompilator :)

    Pozdrawiam,
    Dr.Vee
  • #14 5569283
    demoh
    Poziom 19  
    Wlasnego kompilatora raczej pisac nie bede bo i po co?

    Tak jak pisalem wczesniej. To akurat pisze dla samego siebie i czas jakos roli nie gra zbyt waznej wiec moge sobie dlubac do woli :D Niektorzy lubia grac w pilke godzinami inni zbierac i ogladac znaczki a ja lubie dlubac w kodzie ;)
  • #15 5569335
    zumek
    Poziom 39  
    demoh napisał:
    Akurat w tym przypadku nie jest logiczne. U mnie nie chodzilo o stworzenie funkcji przerywania i skoku do niej w tablicy wektorow przerywan.

    No to trzeba było "jawnie" o tym napisać , a wtedy bym Ci zaproponował __attribute__ ((naked)) .

    Piotrek
  • #17 5569698
    zumek
    Poziom 39  
    Freddie Chopin napisał:
    uzywanie ((naked)) poza najprostszymi przypadkami ...

    A uważasz , że inkrementacja jednej zmiennej , to jakiś strasznie skomplikowany temat :?:
    Poza tym , autor i tak już ogołocił GCC , ze wszystkiego :-P

    Piotrek
  • #18 5569778
    Freddie Chopin
    Specjalista - Mikrokontrolery
    nie chodzi o to, czy straszna czy nie, ale o to, ze zmiana optymalizacji moze poskutkowac tym, ze zamiast 5 zmiennych wystarczy zarezerowac miejsce tylko na 3. w ta strone jest ok, ale jak sie zmieni z 3 na 5, to powodzenia w szukaniu bledu <:

    4\/3!!
  • #19 5569813
    demoh
    Poziom 19  
    __attribute((naked)) doslownie ogolaca funkcje :D Ale troche za ostro :P

    Juz wole uzywac __vector_x :D

    A przez ten czas mocowania sie z tym podszlifowalem pisanie makr (jeszcze kilka mam w projekcie) i uzywania __attribute__ :D Wiec na marne nie poszlo :)
REKLAMA