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

[avrgcc] rejestr jako argument funkcji - da się?

MADevil 28 Lut 2009 22:28 1722 14
  • #1 6219264
    MADevil
    Poziom 18  
    Hej,

    pisze sobie programik na AVRka w avrgcc, przydatną rzeczą była by możliwość przekazania w wywołaniu funkcji, który rejestr (OCR0a,OCR0B) i w jakiej kolejnoći chcę modyfikować.
    Da się coś takiego zrobić?
    Nic na ten temat nie znalazłem, czuję że się da, tylko nei wiem jak to zadeklarować.

    Za wszelką pomoc z góry dzięki :)
  • #2 6219421
    maly_elektronik
    Poziom 23  
    Strasznie niezrozumiale piszesz :( Jeżeli chodzi ci o przekazanie jakiegoś argumentu przez funkcję to np. tak:
    
    void moja_funkcja(char argument)
    {
     if(argument == jakas_wartosc)
     zrób cośtam;
    {
    

    i później w main'ie wywołanie twojej funkcji
    
    moja_funkcja(0xAA); // wartosc moze byc dowolna i/lub zależna od programu
    


    Pozdrawiam maly_elektronik
  • #3 6219440
    MADevil
    Poziom 18  
    Nie o to mi chodzi.

    Chodzi mi o to czy jest sposób na zrobienie funkcji:

    void funkcja(SFR x);


    czyli wywołanie np:
    funkcja(OCR0A);
  • #4 6219511
    maly_elektronik
    Poziom 23  
    tak można coś takiego ale troche inaczej :)
    Jako argument możesz dać jakieś przykładowe porównanie a dopiero w funcji po sprawdzeniu tegoż argumentu, modyfikować ustawienia rejestru OCR0A
    np:
    
    void zmien(char *name, char value)
    if(name == "OCR0A")
    {
     {
      OCR0A = value;
     }
    }
    

    w main'ie

    
    zmien(OCR0A, 0x01);
    

    Mam nadzieje że tym razem Cię dobrze zrozumiałem

    Pozdrawiam maly_elektronik
  • #5 6219540
    MADevil
    Poziom 18  
    Tym razem dobrze, ale to rozwiazanie jest do kitu.
    W ten sposób to można to zrobić na zmiennej przyjmującej wartości w zalezności od SFRa do zmodyfikowania - zajmuje mniej pamięci.
    A sam sposób to milionifów przy kilku kombinacjach zmiennych - rozbi się niepotrzebna kobyła.

    Ja wymyśliłem inny środek zastępczy teraz i pracuję nad jego uruchomieniem.

    Ale najlepsze by było zwyczajne przekazanie nazwy SFRa...
  • #6 6219564
    maly_elektronik
    Poziom 23  
    to oczywiście był przyklad :)
    zamiast wstawiać łańcuch możesz poprostu wstawiać jakiś znak :)
    A co do przekazywania bezpośrenio wartości do rejestru to lepsze i może pewniejsze było by makro w define :)
    
    #define zmien(rejestr, wartosc) rejestr = wartosc 
    


    Ale tego deklarowania nie jestem pewien (nie pamietam zbyt dobrze ale powinno być OK)

    Pozdrawiam maly_elektronik :)
  • Pomocny post
    #7 6219605
    Freddie Chopin
    Specjalista - Mikrokontrolery
    co za bzdury zamiast porad...

    rejestry sterujace sa najzwyklejszymi zmiennymi siedzacymi w pamieci procka, wiec wystarczy przekazac ich adres i tyle.

    void funkcja(volatile uint8_t *rejestr) {...}

    funkcja(&PORTA);

    4\/3!!
  • Pomocny post
    #8 6219616
    Dr.Vee
    VIP Zasłużony dla elektroda
    Albo makro, albo możesz przekazać adres SFRa jako (volatile uint8_t*). Zobacz: http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass

    Jeśli funkcja będzie inline, to kompilator być może wygeneruje efektywny kod (IN/OUT/SBI/CBI). W przeciwnym wypadku będziesz miał LD/ST.

    Jeśli będziesz przekazywać tylko jeden z 2 możliwych rejestrów, to rozważ użycie stałej/enum - dla ustawiania/zerowania bitów w SFR zapewne będzie to szybsze niż LD/ST, ale dla samego odczytu/zapisu już niekoniecznie - stąd zależy jakie operacje chcesz wykonywać na tym SFRze.

    Pozdrawiam,
    Dr.Vee
  • #9 6220566
    MADevil
    Poziom 18  
    Dr.Vee napisał:
    ...to rozważ użycie stałej/enum - dla ustawiania/zerowania bitów w SFR zapewne będzie to szybsze niż LD/ST, ale dla samego odczytu/zapisu już niekoniecznie - stąd zależy jakie operacje chcesz wykonywać na tym SFRze.


    zmieniam całą wartość, bo to o sterowanie PWMem chodzi, więc ta druga opcja, dzięki wielkie, popróbuję :)


    :arrow: Freddie Chopin
    Dzięi wielkie, takiej odpowiedzi oczekiwałem :)
  • #10 6222279
    ZlyDotyk
    Poziom 19  
    Dr.Vee napisał:

    Jeśli funkcja będzie inline, to kompilator być może wygeneruje efektywny kod (IN/OUT/SBI/CBI). W przeciwnym wypadku będziesz miał LD/ST.



    A co ma do tego inline ?
  • #11 6222464
    master_pablo
    Poziom 16  
    Jak kompilator bedzie z gory wiedzial, jakiego rejestru uzyc, to moze cos optymalizowac. W przypadku, gdy funkcja musi byc uniwersalna, bo nie inline i nie wiadomo z jakimi argumentami zostanie wywolana, to juz nie tak latwo zastosowac optymalizacje.
  • #12 6222765
    ZlyDotyk
    Poziom 19  
    to inline nie może być uniwersalny?
  • #13 6222812
    Freddie Chopin
    Specjalista - Mikrokontrolery
    moze, ale funkcja inline jest uzyta KONKRETNA ilosc razy, w KONKRETNYCH miejscach i z KONKRETNYM argmentem. z tego wzgledu kompilator moze KAZDE wystapienie takowej funkcji zoptymalizowac osobno, tak aby byla jak najlepsza. za to gdy funkcja jest nie-inline, to kompilator nie ma prawa zalozyc, ze - dla przykladu - argumenty beda takie, ze lepsza bylaby taka instrukcja, a nie inna, bo musi byc gotowy zarowno na wlaczenie 1 bitu, jak i wszystkich. funkcja w skompilowanej postaci musi byc gotowa do przyjecia WSZYSTKICH mozliwych argumentow z PEŁNEGO zakresu.

    4\/3!!
  • #14 6223108
    ZlyDotyk
    Poziom 19  
    OK - ten argument mnie przekonuje :)
    dzięki i pozdrawiam
  • #15 6225720
    master_pablo
    Poziom 16  
    Lepiej niz Freddie Chopin bym tego nie ujal :).
REKLAMA