Datentypen / Übergabewerte Funktionen

OP #2785334
Lesenswert?

Hallo,

ich bin momentan dabei vom Keil 8051-C51 auf AVR-GCC (Atmel Studio 6) 
umzusteigen. Hierbei durfte ich feststellen, dass GCC einige Datentypen, 
die es in C51 von Keil gibt, nicht kennt. So schlagen in C51 
einwandfreie Funktionsdefinitionen wie z.B.

"unsigned char i2c_get(bit ack)"

gnadenlos fehl da Datentyp "bit" bei GCC unbekannt.

Nachdem ich einiges zum Thema gelesen haben, glaube ich verstanden zu 
haben, dass GCC auf einem AVR(mega) letztendlich nur mit Bytes umgehen 
kann. Zugriff auf Bits ist nur über Bitfelder (mit entsprechend höherem 
Rechenaufwand für die Rangierung in Bytes) möglich.

Bedeutet dies dann, dass die "kleinste" Möglichkeit betreffend 
Ram-Verbrauch wie folgt aussieht ??

"unsigned char i2c_get(unsigned char ack)"
bzw:
"uint8_t i2c_get(uint8_t ack)"

Hier müsste ich dann Rückgabewerte für True/False in meiner Funktion 
festlegen und im weiteren Programm entsprechend auswerten ??


Danke und Grüße
Gregor
Persönliche Seite #2785358
Lesenswert?

Gregor S. schrieb:
> Hallo,
>
> ich bin momentan dabei vom Keil 8051-C51 auf AVR-GCC (Atmel Studio 6)
> umzusteigen. Hierbei durfte ich feststellen, dass GCC einige Datentypen,
> die es in C51 von Keil gibt, nicht kennt. So schlagen in C51
> einwandfreie Funktionsdefinitionen wie z.B.
>
> "unsigned char i2c_get(bit ack)"
>
> gnadenlos fehl da Datentyp "bit" bei GCC unbekannt.

Das könnte damit zusammenhängen, daß gcc ein C-Compiler ist ;-)

Tipp: "bit" ist kein Schlüsselwort in C.

Oder erwartest du, daß GCC ungültigen Code akzeptiert? (Vorausgesetzt, 
bit ist weder C-konformes Makro noch Typedef etc.)

> Nachdem ich einiges zum Thema gelesen haben, glaube ich verstanden zu
> haben, dass GCC auf einem AVR(mega) letztendlich nur mit Bytes umgehen

Es genügt zu wissen, daß avr-gcc ein C-Compiler ist.

Füttere ihn also mit einem C-Programm.

> kann. Zugriff auf Bits ist nur über Bitfelder (mit entsprechend höherem
> Rechenaufwand für die Rangierung in Bytes) möglich.
>
> Bedeutet dies dann, dass die "kleinste" Möglichkeit betreffend
> Ram-Verbrauch wie folgt aussieht ??
>
> "unsigned char i2c_get(unsigned char ack)"

Das verbraucht überhaupt kein RAM weil achk nicht im RAM übergeben 
wird.

> "uint8_t i2c_get(uint8_t ack)"

Verbraucht auch kein RAM, weil der return-Wert nicht im RAM übergeben 
wird.

> Hier müsste ich dann Rückgabewerte für True/False in meiner Funktion
> festlegen und im weiteren Programm entsprechend auswerten ??

Wenn du einen Bool'schen Wert brauchst, nimmst zu zB stdbool.h
Gast #2787015
Lesenswert?

Johann L. schrieb:
> Das verbraucht überhaupt kein RAM weil achk nicht im RAM übergeben
> wird.


> Verbraucht auch kein RAM, weil der return-Wert nicht im RAM übergeben
> wird.


Klugscheiß: Spielst du hier darauf an dass der Wert auf dem Stack 
übergeben wird? Der Stack liegt, zumindest bei mir, auch im RAM.

Du hast natürlich recht, den statischen Verbrauch erhöht das nicht. Nur 
hart an der Grenze des freien RAMs darf man sich nicht bewegen :-)

Ansonsten hat Rolf Magnus natürlich recht.
Gast #2787027
Lesenswert?

Michl schrieb:
> Klugscheiß: Spielst du hier darauf an dass der Wert auf dem Stack
> übergeben wird? Der Stack liegt, zumindest bei mir, auch im RAM.

nein rückgabe werte werden sogar nur im Register übergeben, auch bei 
wenigen parameter wird nur mit Registern gearbeitet also wirkich kein 
Ram.
Gast #2788340
Lesenswert?

Ist lange her, dass ich mit dem Keil C51 gearBytet habe.

Bist du sicher, dass "bit" und Konsorten nicht in irgendeiner Keil 
Headerdatei definiert sind?
Wie schon gesagt wurde, das ist kein elementarer C-Datentyp.
#2788483
Lesenswert?

Gregor S. schrieb:
> Zugriff auf Bits ist nur über Bitfelder (mit entsprechend höherem
> Rechenaufwand für die Rangierung in Bytes) möglich.

Der Rechenaufwand ist (abgesehen von irgendwelchen Optimierungen, die 
der eine oder andere Compiler besser macht), der selbe.
Auch ein Keil Compiler kann einer Funktion kein einzelnes Bit übergeben, 
weil der Prozessor mit 8 bit breiten Daten arbeitet.
Er kann den Aufwand nur besser (aber nicht C-Konform) vor Dir 
verstecken.
Persönliche Seite #2788548
Lesenswert?

Klaus Falser schrieb:
> Auch ein Keil Compiler kann einer Funktion kein einzelnes Bit übergeben,
> weil der Prozessor mit 8 bit breiten Daten arbeitet.

Sowohl MCS-51 als auch AVR bieten auf Assemblerebene direkte 
Bitzugriffe, die im Falle des Keil-Compilers mit nichtportierbaren 
Klimmzügen als C-Konstrukt abgebildet werden.

Die Bitzugriffe des AVR sind einer der Gründe, warum die Bitkonstanten, 
die für Registerbeschreibungen verwendet werden, Bitnummern und nicht 
Bitwertigkeiten sind, was wiederum der Grund für die bei 
AVR-Programmierern so beliebten Schiebe-und-OR-Orgien zur 
Bitwertbestimmung sind.

Bei andere Systemen, wie z.B. MSP430, werden Bitkonstanten als 
Bitwertigkeit definiert, so daß im Code nur OR-verknüpfte Konstanten 
auftauchen.
Gast #2789143
Lesenswert?

Rufus Τ. Firefly schrieb:
> Klaus Falser schrieb:
>> Auch ein Keil Compiler kann einer Funktion kein einzelnes Bit übergeben,
>> weil der Prozessor mit 8 bit breiten Daten arbeitet.
>
> Sowohl MCS-51 als auch AVR bieten auf Assemblerebene direkte
> Bitzugriffe, die im Falle des Keil-Compilers mit nichtportierbaren
> Klimmzügen als C-Konstrukt abgebildet werden.

Das hat aber nichts mit der Frage zu tun, ob und wie man ein Bit einzeln 
als Parameter an eine Funktion übergeben kann. Die Bitzugriffe, von 
denen du sprichst, bekommen auch ein ganzes Register übergeben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren