Forum: Mikrocontroller und Digitale Elektronik AVR: größe der Variablen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sebastian T. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich beschäftige mich seit einiger Zeit mit der AVR Programmierung. Ich 
hab da aber eine Frage:


Wenn ich uint8_t benutze, erstelle ich doch eine 8bit große Variable.
Darf man aber auf einem 8bit AVR einfach größere Variablen wie z.B. 
uint16_t, uint32_t oder gar uint64_t benutzen??

Und falls doch, wie funktioniert das? Werden bei uint16_t zwei 
Speicherregister verwendet?

von Max D. (max_d)


Bewertung
0 lesenswert
nicht lesenswert
Du sagst mit uint16_t dem Compiler, dass in die Zahl 16-Bit passen 
müssen. Ob er die dann in Registern vorhält oder im RAM zwischenlagert 
ist dem überlassen.
Auf einem 8-Bit System muss er halt 2 Speicherplätze verwenden und bei 
jeder Rechenoperation das Carry zwischen den Zellen mitnehmen.

Du kannst auch uint16_t und uint32_t usw. verwenden, allerdings bremst 
das natürlich den Fluss je nach Operation aus, weil der Compiler 
nacheinander die einzelnen Bytes bearbeiten muss.

: Bearbeitet durch User
von georg (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian T. schrieb:
> Darf man aber auf einem 8bit AVR einfach größere Variablen wie z.B.
> uint16_t, uint32_t oder gar uint64_t benutzen??

Das ist eine Frage des Compilers, nicht des AVR: du kannst benutzen was 
immer der Compiler zulässt, der muss eben für jeden erlaubten 
Variablentyp eine geeignete Funktion einbauen.

RTFM gilt ganz besonders für Compiler. Vermutlich wird auch, wenn du 
unbedingt 64bit-Variablen verwenden willst, zusätzlicher Code 
dazugelinkt, was das Programm vergrössert, nicht nur den benötigten 
Arbeitsspeicher.

Georg

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Bewertung
-2 lesenswert
nicht lesenswert
Auf einem ATMega1284 könntest Du eine uint131072_t-Variable verwenden 
wenn Du ohne Stack usw. auskommst.

von Axel S. (a-za-z0-9)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian T. schrieb:
> Ich beschäftige mich seit einiger Zeit mit der AVR Programmierung.

Anscheinend mit der Programmierung in C. Das ist wichtig zu erwähnen. 
Denn natürlich gibt es auch noch andere Programmiersprachen für den AVR 
oder man kann ihn in Assembler programmieren.

> Wenn ich uint8_t benutze, erstelle ich doch eine 8bit große Variable.

uint8_t ist - wie der Name schon sagt - ein Typ für vorzeichenlose 
Ganzzahlen mit (mindestens) 8 Bit Breite. Beim AVR sind es sogar genau 8 
Bit Breite, weil das seine natürliche Datenbreite ist.

> Darf man aber auf einem 8bit AVR einfach größere Variablen wie z.B.
> uint16_t, uint32_t oder gar uint64_t benutzen??

Ja. Genauer gesagt darfst du alle Typen nutzen, die der C Compiler für 
den AVR kennt. Die genannten gehören alle dazu.

> Und falls doch, wie funktioniert das? Werden bei uint16_t zwei
> Speicherregister verwendet?

Im Prinzip ja. Wobei der C-Compiler nicht zwangsweise die komplette 
Variable auf einmal in Registern halten muß. Beim AVR würde das gehen, 
aber C gibt es ja auch für Architekturen wie den 6502 oder STM8. Die 
haben nur einen 8-Bit Akku. Die können also die z.B. 8 Bytes eines 
uint64_t gar nicht auf einmal in Registern halten. Sondern müssen die 
Variable byteweise aus dem Speicher in den Akku laden, bearbeiten und 
wieder wegspeichern.

Dieser Komfort ist ein Grund, warum C sich gegenüber Assembler 
durchgesetzt hat.

von (prx) A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
Axel S. schrieb:
> uint8_t ist - wie der Name schon sagt - ein Typ für vorzeichenlose
> Ganzzahlen mit (mindestens) 8 Bit Breite.

Mit exakt 8 Bits. Mindestens 8 Bits gibts bei int_least8_t.

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian T. schrieb:
> Darf man aber auf einem 8bit AVR einfach größere Variablen wie z.B.
> uint16_t, uint32_t oder gar uint64_t benutzen?

Darf man, kann man. Ist kein Problem. Dass die AVRs 8 Bit µCs sind hat 
nichts mit der Größe der Variablen zu tun sondern, grob gesagt, wie sie 
Befehle und Daten verarbeiten. Das passiert idR immer nur in 8 Bit 
Blöcken.
Ist jetzt mega oberflächlich aber ich denke es genügt zur Beantwortung 
deiner Frage. Für Genaueres empfehle ich dir das Studium entsprechender 
Literatur wenn du mehr darüber erfahren willst, was 8 Bit Prozessor 
bedeutet.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Axel S. schrieb:
> Dieser Komfort ist ein Grund, warum C sich gegenüber Assembler
> durchgesetzt hat.

Das macht es auch möglich, dass einem der Compiler vorgaukelt, den 
Datentyp double zu kennen, obwohl er gar nicht mit 8 Byte 
Gleitkommazahlen nach IEEE 754 umgehen kann.

von (prx) A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian T. schrieb:
> Wenn ich uint8_t benutze, erstelle ich doch eine 8bit große Variable.

Bitte beachten, dass Operationen in C auch dann mit mindestens der 
Breite von "int" oder "unsigned" gerechnet werden, wenn die darin 
vorkommenden Datentypen kleiner sind. Da "int" und "unsigned" mindestens 
16 Bits breit sein müssen, gibt es in C formell keine 8-Bit Operationen. 
Zumindest muss das Ergebnis dieser Vorschrift entsprechen, real kommen 
8-Bit Operationen also vor.

von Dirk B. (dirkb2)


Bewertung
-1 lesenswert
nicht lesenswert
Die Berechnungen in C werden mindestens als int durchgeführt.

Ein int hat laut C-Standard mindestens den Wertebereich von -32767 bis 
32767.

von M. K. (sylaina)


Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Die Berechnungen in C werden mindestens als int durchgeführt.
>
> Ein int hat laut C-Standard mindestens den Wertebereich von -32767 bis
> 32767.

Das mag sein aber wenn man int8_t schreibt für einen Mikrocontroller 
dann kann es einem recht egal sein wie das in C gerechnet wird, auf dem 
µC wird es von -127 bis 128 gehen (Übrigens: dein int geht bis 32768, 
nicht 32767 ;)).

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian T. schrieb:
> Darf man aber auf einem 8bit AVR einfach größere Variablen wie z.B.
> uint16_t, uint32_t oder gar uint64_t benutzen??

Du darfst sogar float und double benutzen, obwohl der AVR keine FPU hat. 
Beides ist auf dem AVR-GCC 4 Byte groß.

Nicht nativ unterstütze Rechenarten werden emuliert, d.h. es werden 
Bibliotheksfunktionen aufgerufen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.