-         

Ergebnis 1 bis 5 von 5

Thema: pointer auf register

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150

    pointer auf register

    Anzeige

    Hallo,
    ich will bei meinem atmega32 an eine Funktion einen Pointer auf ein PIN-Register übergeben. Zusammen mit der Pin-Nummer könnte ich dann einen bestimmten Pin setzen. Also so:

    SetOutput(volatile uint8_t *pu8_Register, uint8_t u8_Pin)
    {
    (*pu8_Register) |= (1<<u8_Pin);
    }

    Da der Compiler nicht weiß, dass ich "nur" auf ein Register zugreifen will ist der Pointer 16 Bit breit. Das wird also in Assembler eher aufwendig. Dazu kommt nocht, das nicht der OUT-Befehl, sondern ein Zugriff über Z-Pointer gemacht wird.

    Weiß jemand, wie man den Compiler dazu überreden kann nur einen 8Bit breiten Pointer zu nehmen?
    Das mit dem OUT könnte man mit Inline-Assembler lösen. Oder gibts da auch was besseres?

    Drew


  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672

    Re: pointer auf register

    Zitat Zitat von drew
    Weiß jemand, wie man den Compiler dazu überreden kann nur einen 8Bit breiten Pointer zu nehmen?
    Gar nicht.

    Zitat Zitat von drew
    Oder gibts da auch was besseres?
    Mach die Funktion "static inline", und rufe sie mit Konstanten auf, dann optimiert der Compiler das alles raus. Aus einem "SetOutput(&PORTC, 2);" wird dann ein simples "sbi 0x08, 2". Wenn du aber die Funktion mit Variablen aufrufst, hat er kaum eine Chance, das dermaßen zu optimieren. In dem Fall solltest du dir noch mal ausführlich Gedanken um das Grundkonzept deines Programms machen. Ich persönlich habe noch nie eine zwingende Notwendigkeit für variable Portadressen gesehen.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Also wenn du das tatsächlich so machen willst, wirst du nur dann 100% effizienten Assembler Code erreichen, wenn du ihn selber schreibst.
    (inline asm wäre ein gangbarer Weg)
    So viele Treppen und so wenig Zeit!

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    Danke für Eure Hilfe.

    Schade, dass das nicht so geht.
    Ich werde wohl erst mal wieder auf Inline zurück gehen.


  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Zitat Zitat von Felix G
    Also wenn du das tatsächlich so machen willst, wirst du nur dann 100% effizienten Assembler Code erreichen, wenn du ihn selber schreibst.
    (inline asm wäre ein gangbarer Weg)
    Ich sehe nicht, was (Inline) Assembler hier bringen soll. Wenn Adresse oder Bitposition zur Compilezeit (bei Assembler zur Assemble-Zeit) nicht bekannt sind, dann kann man kein SBI oder CBI verwenden. Die einzige Möglichkeit, ist dann ein indirekter Zugriff und/oder Maskierung mit zur Laufzeit berechneter Maske.

    Mit (Inline)Assembler hat man zusätzlich ds Problem, daß wenn die Adresse bekannt ist, man zwischen IN/OUT und LDS/STS unterscheiden will. Das kann der Compiler, aber in Inline-Assembler wird das ein totales Gemurkse

    Die Frage die sich hier stellt, warum man überhaupt eine Funktion dafür bemüht, und warum es keine Inline-Funktion ist; wenn schon.
    Disclaimer: none. Sue me.

Berechtigungen

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