Ich habe einen Code für den 8051-Mikrocontroller geschrieben, in dem ich den Bittyp verwendet habe, ungefähr so:
static bit done_flag = 0; /* bit variable */
bit testfunc ( /* bit function */
bit flag1, /* bit arguments */
bit flag2)
{
.
.
.
return (0); /* bit return value */
}
Jetzt portiere ich dies auf den ATmega16 AVR-Controller. Ich habe festgestellt, dass der
Bittyp in AVR nicht unterstützt wird .
Das AVR-lib C-Benutzerhandbuch lautet:
Datentypen: char ist 8 Bit, int ist 16 Bit, long ist 32 Bit, long ist 64 Bit, float und double sind 32 Bit (dies ist das einzige unterstützte Gleitkommaformat), Zeiger sind 16 Bit (Funktionszeiger sind Wortadressen, um die Adressierung von bis zu 128 KB Programmspeicherplatz zu ermöglichen). Es gibt eine Option -mint8 (siehe Optionen für den C-Compiler avr-gcc), um int 8 Bit zu erstellen. Diese Option wird jedoch von avr-libc nicht unterstützt und verstößt gegen C-Standards (int muss mindestens 16 Bit betragen). Es kann in einer zukünftigen Version entfernt werden.
Was soll ich jetzt machen?
bool
Datentyp verwenden, aber ich denke, dass dieser immer noch als Byte gespeichert wird, da sind Sie sich nicht 100% sicher.Antworten:
Sie können eine Struktur wie diese verwenden:
Und um auf ein Bit auf einmal zuzugreifen, müssen Sie nur
quelle
bit
oderbdata
Leerzeichen verwenden; Da Bitfelder nicht so gut funktionieren können, haben die Compiler-Autoren möglicherweise nicht gedacht, dass ihre Optimierung Priorität hat.bool
s anstelle eines Bitfelds haben, verwenden Siebool
s. Wenn Sie diese Bits stattdessen zu „Pack“ wollen und beste Leistung wollen, sollten Sie „handmade“ diejenigen, zB über#defines
:#define MY_BIT_VALUE_1 _BV(0) #define MY_OTHER_BIT_VALUE _BV(1) ...
innerhalb einer einzigen gespeichertenuint8_t
Variablen.Wie PeterJ bereits in seinem Kommentar erwähnt hat, würde ich die Verwendung vorschlagen
bool
.Sie müssen die stdbool-Bibliothek einschließen.
Wie bereits erwähnt, handelt es sich bei AVRGCC
bool
um 8-Bit und nur um eine Abstraktion von auint8_t
. Wenn Sie damit nicht leben können und jedes einzelne Bit speichern müssen oder Tonnen von globalen "Ja / Nein" -Flaggen haben (was auf eine schlechte Codierungspraxis hinweisen könnte), können Sie überlegen, was Naeriel in seiner Antwort gepostet hat.Die Verwendung von bool und der richtigen Benennung von Variablen (unter Verwendung des "is" -Präfix) führt jedoch zu viel saubererem Code. Zum Beispiel verwenden
anstelle von "done_flag". Dieser Weg ist für jemanden offensichtlicher, der den Code nicht kennt, was genau der Zustand signalisiert.
quelle
Verwenden Sie stattdessen vorzeichenloses Zeichen . Dies verwendet jedoch ein ganzes Byte anstelle eines Bits.
quelle
Sie können so etwas verwenden:
#define bit_get(p,m) ((p)&(m)) #define bit_set(p,m) ((p)|=(m)) #define bit_clear(p,m) ((p)&=~(m)) #define BIT(x) (0x01<<(x))
Anwendungsbeispiel:
bit_set(DDRB,BIT(4))
setzt PB4 als Ausgangspin.
Quelle: http://www.avrfreaks.net/
quelle