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

[AVR][C] własna funkcja -czy można napisać prościej ?

kazeciak 12 Paź 2008 04:03 3948 13
  • #1 5623008
    kazeciak
    Poziom 15  
    Witam serdecznie

    Nie jestem programistą, ale czasem piszę jakieś programy. Pozostanę wdzięczny za wszelkie sugestie odnośnie estetyki etc. Mimo iż nie publikuję swoich wypocin, nie chcę jednak nabierać złych nawyków.

    Poniższa funkcja powstała z myślą o eliminacji wpływu drgania styków oraz innych zakłóceń na przełącznikach/stycznikach itp. co w moim opracowaniu jest krytycznym parametrem.

    Moje pytanie brzmi: czy ta funkcja jest prawidłowo napisana i czy da się
    ją ewentualnie "odchudzić" (mam na myśli wielkość kodu wynikowego)
    Sama funkcja oczywiście działa bez zarzutu i jest wywolywana w przerwaniu.

    Dziękuję i pozdrawiam,
    Marcin

    
    //...
    //...
    // przykladowa konfiguracja
    #define KEY_TIME_DELAY 10
    #define PIN PINB
    #define WLACZNIK 1
    
    
    
    
    //----------------------FUNKCJA SPRAWDZAJACA STAN WYPROWADZANIA----------------//
    int stan_przycisku(int a)
    {
    int i, j;
    
    i = KEY_TIME_DELAY ;				// ilosc "probek"
    j = KEY_TIME_DELAY/2;				// ilosc "probek" dla pozytywnego wyniku (50%)
    
    		while(i)
    		{
    			if (bit_is_set(PIN, a)) // jesli sygnal jest podany	 		 
    			
    			{																				
    				j--;					
    			}
    		
    		i--;
    		}
    	if(j<=0)						
    	return 	1;						//  jesli podany przez ponad 50% czasu "1"
    	else return 0;					//  lub "0" jesli nie 
    
    }
    //------------------------------------------------------------------------------//
    
    
    
    int main()
    {
    if (stan_przycisku(WLACZNIK) == 1 )
          {
            
          }			// przykladowe wywolanie funkcji
    }
    
  • #2 5623138
    Freddie Chopin
    Specjalista - Mikrokontrolery
    a czemu nie standardowo?

    jedno probkowanie i po 20-50ms drugie - jesli identyczne to masz wynik, jesli rozne, to nie? biorac pod uwage ze u ciebie nia ma opoznien zadnych, to smiem twierdzic, ze byloby to nawet troche lepsze.

    4\/3!!
  • #3 5625245
    kazeciak
    Poziom 15  
    Dziękuję za odpowiedź

    Wpisałem do programu _delay_ms(x) i wielkość kodu po tym wpisie podskoczyła prawie pięć razy, pierwsze wywołanie tej funkcji daje +~3k do wagi kodu, co dla mnie jest zastraszające, gdyż pojemność mojego procesora to 1k. Niestety mam tam tylko jeden timer i jest on już zajęty.
    Zastanawiam się, z czego to wynika (ten ogrom zajmowanego miejsca)
    Pracuję w środowisku AvrStudio z avr-gcc.
  • #4 5625441
    Konto nie istnieje
    Konto nie istnieje  
  • #5 5625819
    Klima
    Poziom 31  
    kazeciak napisał:
    Dziękuję za odpowiedź

    Wpisałem do programu _delay_ms(x) i wielkość kodu po tym wpisie podskoczyła prawie pięć razy, pierwsze wywołanie tej funkcji daje +~3k

    Idę o zakład, że x jest zmienną. Spróbuj wpisać tam zamiast x jakąś konkretną wartość, żeby była znana już na etapie kompilacji. Akurat pisałem program, który używał _delay_ms i w całości miał 3k, a robił dużo więcej niż tylko to oczekiwanie - m. in. były napisy, UART i podobne bajery.

    Edit:
    U mnie _delay_ms zajmuje poniżej 200 bajtów. I tak dużo. Ale ja mam ATmegę88, czyli nawet po tym zostaje mi ponad 50% wolnego. Jak ci zależy na małym rozmiarze, to walnij w asemblerze konstrukcję typu pętla w pętli w pętli - małe kilkadziesiąt bajtów powinno wystarczyć.
  • #6 5625981
    kazeciak
    Poziom 15  
    Cytat:
    Wydaje mi się ze funkcja zadziała za "szybko" jak na 10 próbek.

    To tylko przykład, w gotowym układzie wartość ta jest o wiele większa.

    Cytat:
    Idę o zakład, że x jest zmienną.

    Tak własnie jest, posłużyłem się tutaj symbolem "x" gdyż nie ma większej różnicy w wielkości kodu między wpisaniem "1" lub "200"

    Timer mam niestety już zajęty.

    Rozwiązałem problem (tak mi się wydaję przynajmniej)
    Po włączeniu optymalizacji kodu Project/Project Options/ na "-01" gdzie wcześniej było "-00" kod zajmuje ~80 bajtów.
    Dopiero przy napisaniu oddzielnego programu zawierającego jedynie
    wywołanie funkcji _delay_ms() kompilator wypisał ostrzeżenie z biblioteki delay.h o treści:

    Cytat:
    (...)#warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"


    Mogę prosić o wyjaśnienie tego parametru ? Chodzi o to czym jest ta "optymalizacja kodu" i w jaki sposób się nią posługiwać.
  • #7 5626027
    Klima
    Poziom 31  
    kazeciak napisał:
    Tak własnie jest, posłużyłem się tutaj symbolem "x" gdyż nie ma większej różnicy w wielkości kodu między wpisaniem "1" lub "200"


    Ale piszesz:
    _delay_ms(200);
    


    czy:
    unsigned char opoznienie;
    ...
    opoznienie = 200;
    ...
    _delay_ms(opoznienie);
    


    Bo jest różnica! Funkcja _delay_ms pobiera wartość double jako parametr!! Zachodzi więc potrzeba dodania obsługi wartości zmiennoprzecinkowych jeśli parametr jest zmienną! Poczytaj w dokumentacji do AVR-libc (WinAVR ma to w katalogu doc)
  • #8 5626035
    kazeciak
    Poziom 15  
    Piszę _delay_ms(200);
    Bardzo dziękuję za zainteresowanie!
  • #9 5626048
    Klima
    Poziom 31  
    No to ci powiem, że coś tam masz nie tak zakombinowane. Specjalnie sprawdziłem u mnie - mam w programie 2 razy wywołanie _delay_ms. Po ich wykomentowaniu kod maleje o jakieś 200 bajtów. Jaki masz procesor?
  • #10 5626069
    kazeciak
    Poziom 15  
    W takim razie, postaram się podać to na przykładzie.
    Procesor to ATTINY13

    Poniżej przedstawiam kod testowego programu:

    
    #define F_CPU 1000000UL // 1MHz
    #include <util/delay.h>
    
    int main()
    {
    	_delay_us(10) ;
    	return 0;
    }
    


    Wynik kompilacji z ustawieniem optymalizacji kodu na "-00"

    Cytat:

    (...)
    (...)delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"

    AVR Memory Usage
    ----------------
    Device: attiny13

    Program: 3582 bytes (349.8% Full)
    (.text + .data + .bootloader)

    Data: 8 bytes (12.5% Full)
    (.data + .bss + .noinit)
    Build succeeded with 1 Warnings...



    Oraz wynik kompilacji po przestawieniu w/w ustawienia z "-00" na "-01"

    Cytat:

    AVR Memory Usage
    ----------------
    Device: attiny13

    Program: 88 bytes (8.6% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)
    Build succeeded with 0 Warnings...

  • #11 5626105
    Dr.Vee
    VIP Zasłużony dla elektroda
    Gdybyś przeczytał dokumentację tej funkcji, to byś wiedział, że korzystają one z arytmetyki zmiennoprzecinkowej. Bez optymalizacji to procesor (zamiast kompilatora) będzie musiał wykonać obliczenia zmiennoprzecinkowe - a to oznacza dołączenie kodu obsługi liczb zmiennoprzecinkowych.

    Pozdrawiam,
    Dr.Vee
  • #12 5626133
    kazeciak
    Poziom 15  
    Dziękuję za odpowiedź

    Jak jednak jest z tą "optymalizacją" kodu ? oczywiście popatrzyłem do dokumentacji od "gcc" jednak chciałbym polegać bardziej na waszym doświadczeniu. Jakie są przeciwwskazania/newralgiczne punkty/etc. przy stosowaniu takiej optymalizacji ?

    Jeśli chodzi o czytanie dokumentacji, to staram się to robić, jak jednak nadmieniłem na samym początku, nie jestem programistą, moja wiedza o "Uc" też kuleje a informacje zawierane w bibliotekach są często "nieczytelne" dla kogoś takiego jak ja i stąd takie a nie inne pytania. Myślę, że gdyby każdy potrafił czytać sprawnie takie dokumentacje, to forum to zawierało by "lekko" z 80% mniej postów. Oczywiście proszę się nie doszukiwać w tym stwierdzeniu żadnej "złośliwości" po prostu staram się trochę usprawiedliwić.
  • #13 5626184
    Freddie Chopin
    Specjalista - Mikrokontrolery
    optymalizacja na max (zwykle Os jest odpowiednia opcja) [; to logiczne ze im program bardziej optymalny tym lepszy [;

    do celow debuggowania zas lepiej ustawic optymalizacje stosunkowo nisko - nawet na 0.

    zas co do 80% - to by bylo pieknie, staramy sie jak mozemy, ale wychodzi roznie ... <:

    4\/3!!
  • #14 5626577
    Klima
    Poziom 31  
    No tak. Na to to nikt nie wpadł. W większości przypadków pisząc na małe mikrokontrolery używa się optymalizacji rozmiaru kodu wynikowego "-Os". Przy wyłączonej optymalizacji _delay_ms działa niepoprawnie.
REKLAMA