-
        

Ergebnis 1 bis 9 von 9

Thema: Wann kann das Sichern von Registern in der ISR entfallen?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.01.2010
    Ort
    Franken
    Alter
    31
    Beiträge
    27

    Wann kann das Sichern von Registern in der ISR entfallen?

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    ich möchte in einer ISR unter berstimmten Bedingungen einen Pin ein/ausschalten. Der Code der ISR würde in Etwa so aussehen, wobei SetBit ein einfaches Makro ist:

    Code:
    if (ON)
    {
       if (EnableBit0)
          SetBit(PortX,0);
       if (EnableBit1)
          SetBit(PortX,1);
       if (EnableBit2)
          SetBit(PortX,2);
       .....
    }
    else
    {
       if (EnableBit0)
          ClearBit(PortX,0);
       if (EnableBit1)
          ClearBit(PortX,1);
       if (EnableBit2)
          ClearBit(PortX,2);
       .....
    }
    Welche Register muss ich nun in der ISR sichern, oder erkennt das gar der GCC selbst und sichert nur das was notwendig ist? Ich mache mir die Gedanken deshalb, weil die ISR bis zu ~15.000 mal pro Sekunde aufgerufen werden kann.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    An sich ist GCC zuständig, darauf aufzupassen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Mit dem GCC kenne ich mich nicht aus, aber wenn sicher gestellt ist das deine
    ISR und die Programme in derselben, keine Register überschreiben die noch
    gebraucht werden kann man das übergehen.

    Gruß Richard

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    GCC sichert die von ihm benutzten Register selbst.

    mfG
    Markus

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Um das sichern der Register kümmert sich GCC schon (wenn man es nicht expizit abschaltet für die ISR, per Zusatz "naked"). Man sollte nur vermeiden in der ISR eine funktion aufzurufen. Dann kann es passieren, dass GCC alle register sichert, obwohl es nicht nötig ist. Ein Makro ist aber OK, genau wie eine Inline Funktion..

    So oft ist 15000 mal die Sekunde noch nicht.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    D.h. wenn ich z.B. in einer Timer-ISR nur ne volatile-Variable hochzählen lass, dann kann ich die ISR als naked verbauen? Aber muss der die Variable dazu nicht auch in ein Register laden, wobei ein evtl. Wert überschrieben wird?
    #ifndef MfG
    #define MfG

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    28
    Beiträge
    607
    Nicht wenn du deine Variable als "register" Variable deklariert hast, dann bleibt sie immer in einem bestimmen Register (weiß allerdings nicht, wie das bei Variablen ist, die mehr als ein Byte groß sind).
    Diese Variable kannst du dann beliebig hoch oder runterzählen. Was du sonst noch damit machen kannst hängt davon ab, in welchem Register sie gespeichert wird.

    Gruß, Yaro

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    @Jaecko: Vorsicht!
    Das Hochzählen verändert das Statusregister SREG - du musst also zumindest das Status-Register sichern (und danach wiederherstellen), bevor du Operationen durchführst, die dieses verändern.

    mfG
    Markus

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Möglichkeit das Register retten zu unterdrücken ist fast nur für Assembler Code sinnvoll. Nur da weiss man von vornherrein welche Register gerettet werden müssen. Kurzen Stücke kann man so als inline ASM einbinden. Nur mit C Code geht das fast nicht, denn da wird oft das SREG verändert.

    Bei einer ISR in ASM ist der normale Weg aber eher die ganze ISR in ein extra File (xxx.s) auszulagern.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •