-
        

Ergebnis 1 bis 8 von 8

Thema: kleine Frage zum Int16 auf nen 8-Bit controller

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.06.2004
    Ort
    Berlin
    Beiträge
    52

    kleine Frage zum Int16 auf nen 8-Bit controller

    Anzeige

    Hallo,
    der atmega8 ist doch ein 8-Bit-Controller.
    Wenn ich jetzt folgenden code nehme:
    Code:
    uint8_t high,low;
    uint16_t ui16;
    ui16 = (high << 8) + low;
    Wird der Controller dann in dem ui16 Wert das Richtige stehen?
    Macht der compiler das für mich? Da stecken ja dann mehrere Assembler-Befehle dahinter.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    jo ist völlig in ordnung so, mahc ich auch immer so

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Genau für so etwas hat man den Compiler, damit man sich nicht um die Details kümmern muß.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Die Operationen bedingen implizite Typ-Erweiterungen auf int. Je nachdem, wie groß ein int ist, funktioniert es also (mindestens 16 Bit) oder nicht. Letzteres kann passieren, wenn man avr-gcc mit der Option -mint8 verwendet.
    Disclaimer: none. Sue me.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.378
    ah stimmt , der part (high << gibt bei (high << 16) nur 0 aus, du müsstest bei allem was grüßer 16bit iss also auch explizit nen cast machen damit er weis womit errechnen soll

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Im Zweifalsfalle ein C-Buch fragen. Oder einfach anschauen, was der Compiler draus bastelt...
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    27
    Beiträge
    607
    Anstatt es 8 mal logisch nach links zu schieben, könnte es unter Umständen sogar besser sein, es mit 256 zu multiplizieren, denn die Mega-Familie verfügt über hardware-Multiplikation, die bei zwei bytes nur 2 Takte dauert. Dann kommen noch ca. 3 Takte zusätzlich für interne Registerbefehle hinzu. Macht insgesammt ca. 5 Takte anstatt der sonstigen (mindestens) 8 Takte.

    Gruß, Yaro

  8. #8
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Ein guter Compiler sollte erkennen das <<8 ein shift um ein Byte stattfindet und gleich das richtige Byte nehmen. Wenn man den Compiler auf die Sprünge helfen will, da wohl besser geleich indem man die variabel als Union definiert und so auf die einzelenen Bytes zugreifen kann.

    Für Zugriffe auf 16 Bit breite Register (z.B Timer, ADC) hat GCC Vorkeherungen für den direkten Zugriff. Da kümmert sich der Compiler sogar um die Reihenfolge in der H/L Byte gelesen bzw. geschrieben werden.

Berechtigungen

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