Wie lauten diese Codezeilen (Keil-Compiler) für GCC?

Gast #5043416
Ich versuche mich gerade an der Ansteuerung eines Displays per 4-Wire 
SPI Mode bzw. an dem Samplecode des Herstellers, kann aber mit zwei 
Zeilen nach dem #define (wohl Keil-Compiler) nichts anfangen. Wie 
schreibt man das für den GCC-Compiler um? Wäre lieb, wenn mir das jemand 
kurz erklären würde.
1
uchar bdata transdata;      
2
sbit transbit = transdata^7;


Hier nochmal im Kontext mit der Funktion
1
#define uchar unsigned char
2

3

4
uchar bdata transdata;      
5
sbit transbit = transdata^7;
6

7

8

9

10
void SdCmd(uchar cmd)
11
{
12
  uchar j;
13
  transdata = cmd;            // The command put in BIT-byte variable 
14
  SCK  = 1;          // Initial SCK
15
  D_C  = 0;          // D_C = 0£¬select command register 
16
  _CS  = 0;          // Enable the access       
17

18
  SCK  = 0;
19
  for(j=0;j<8;j++)
20
  {
21
  SDA  = transbit;        // To Start transfer From Highest bit 
22
  SCK  = 1;          // Enable at rising SCK edge
23
  SCK  = 0;          // Prepare write signal for next bit
24
  transdata = transdata<<1;      // One bit left shift 
25
  }
26
  _CS  = 1;          // Disable the access  
27
}
Gast
Lars schrieb:
> uchar bdata transdata;
> sbit transbit = transdata^7;

anstatt umschreiben zu lassen, wäre verstehen wichtiger:
uchar bdata => 8-Bit Variable, die im Bit-adressierbaren Bereich, z. 
B. beim c167, plaziert wird.

sbit transbit = transdata^7 => Bit-Variable (bool), die jetzt das 
höchstwertige Bit (7) von transdata repräseniert.

Das wird auch oft bei Bit-adressierbaren Registern benutzt. Wirf mal nen 
Blick in den Header zum µC.
Gast
Lars schrieb:

> #define uchar unsigned char

Typen mit define zu definieren, sollte man generell lassen. Dafür gibt's 
typedef.

Außerdem hat man normalerweise für den Anwendungsfall hier sowieso schon 
den Datentyp uint8_t.
Schmierlappen schrieb:
> DraconiX schrieb:
> Bitte sehr:
> http://bfy.tw/COSl
>
> Was für ein Schmierlappen bist Du doch!

Warum?! Es ist absolute Grundlage! Die unsigned char sollte völlig 
selbstklärend sein. Das sbit ist eben ein Bit (Bit 7 in dem Fall) in 
eben diesem uchar.

Und richtig:

Nop schrieb:
> Typen mit define zu definieren, sollte man generell lassen. Dafür gibt's
> typedef.

Das gehört sich einfach nicht. Oder man sollte verstehen lernen was das 
define darüber überhaupt macht.
Gast
Nop schrieb:
> Typen mit define zu definieren, sollte man generell lassen. Dafür gibt's
> typedef.

Ach wo. Eigentlich ist das egal, ob die Ersetzung beim Präprozessor oder 
etwas weiter hinten erfolgt.

Dieses Wort "typedef" suggeriert einem, daß man damit Typen definieren 
könnte, aber das ist FALSCH. Mit typedef kann man lediglich einem 
bereits vorhandenen Typ einen zweiten Namen geben.

Ob man sowas wirklich gut findet, ist Geschmackssache. Ich halte typedef 
für herzlich überflüssig. Da wären zuvor ganz andere Dinge in C 
verbesserungswürdig.

W.S.
Persönliche Seite
W.S. schrieb:
> Nop schrieb:
>> Typen mit define zu definieren, sollte man generell lassen. Dafür gibt's
>> typedef.
>
> Ach wo. Eigentlich ist das egal, ob die Ersetzung beim Präprozessor oder
> etwas weiter hinten erfolgt.
>
> Dieses Wort "typedef" suggeriert einem, daß man damit Typen definieren
> könnte, aber das ist FALSCH. Mit typedef kann man lediglich einem
> bereits vorhandenen Typ einen zweiten Namen geben.
>
> Ob man sowas wirklich gut findet, ist Geschmackssache. Ich halte typedef
> für herzlich überflüssig. Da wären zuvor ganz andere Dinge in C
> verbesserungswürdig.
>
> W.S.

Falsch:
1
#define defined_type_t unsigned char*
2
typedef unsigned char *typdef_type_t;
3

4
int main(void) {
5
  unsigned char c;
6
  
7
  typdef_type_t  t_a, t_b;
8
  defined_type_t d_a, d_b;
9
  
10
  t_a = &c; /* kein problem */
11
  t_b = &c; /* kein problem */
12
  d_a = &c; /* kein problem */
13
  d_b = &c; /* Fehler! */
14
  
15
  return 0;
16
}
liefert natürlich
1
13:8: error: assigning to 'unsigned char' from incompatible type 'unsigned char *'; remove &
2
        d_b = &c; /* Fehler! */
3
              ^~
Wenn du jetzt sagst, dass man so etwas nicht macht: doch, es gibt Leute, 
die das genau so schreiben.
Natürlich gibt es auch häufig typedefs auf Pointer, wenn man zum 
Beispiel den Inhalt einer Struct verbergen will.
Typedef macht also sehrwohl Sinn.

Mit freundlichen Grüßen,
N.G.
N. G. schrieb:
> W.S. schrieb:
>> Ob man sowas wirklich gut findet, ist Geschmackssache. Ich halte typedef
>> für herzlich überflüssig. Da wären zuvor ganz andere Dinge in C
>> verbesserungswürdig.
>>
>> W.S.
.
> Falsch:
> #define defined_type_t unsigned char*
>   unsigned char c;
>
>   defined_type_t d_a, d_b;
>
>   d_b = &c; /* Fehler! */
>
> liefert natürlich
> 13:8: error: assigning to 'unsigned char' from incompatible type
> 'unsigned char *'; remove &
>         d_b = &c; /* Fehler! */
>               ^~
> Wenn du jetzt sagst, dass man so etwas nicht macht: doch, es gibt Leute,
> die das genau so schreiben.

Ja, so ist das eben wenn man den Unterschied "Typ" und "Textersatz" 
100%tig verstanden hat


;-)
Frank M. schrieb:
> Lars schrieb:
>> uchar bdata transdata;
>
> Da fehlt ein Komma. Richtig wäre hier:
>
1
> uchar bdata, transdata;
2
>
>
> bleibt noch die Zeile für den Typ sbit. Dazu gab es ja schon
> hinreichende Hinweise.

Lars schrieb:
> uchar bdata transdata;
> sbit transbit = transdata^7;
Alles x51-spezifisch.
  bdata: bitaddressierbares RAM
  sbit:  Bit 7 in der bdata-Variable (Standard-c hat da das Bitfield)
1
  struct transdate_t {
2
    uint8t transbit:1;
3
  };
4

5
  transdata_t transdata;
6

7

8
  transdata.transbit = 1;
9

10
  if(transdata.transbit) {
11
    // ...
12
  }
Gast
Carl D. schrieb:
> sbit:  Bit 7 in der bdata-Variable (Standard-c hat da das Bitfield)
> struct transdate_t {
>     uint8t transbit:1;
>   };

Welches Bit vom uint8_t wird hier angesprochen???

Die Anordnung der Bitfelder ist dem Compiler überlassen. Beim sbit 
übernimmst du das. ;-)
Bit By Bit schrieb:
> Carl D. schrieb:
>> sbit:  Bit 7 in der bdata-Variable (Standard-c hat da das Bitfield)
>> struct transdate_t {
>>     uint8t transbit:1;
>>   };
>
> Welches Bit vom uint8_t wird hier angesprochen???
>
> Die Anordnung der Bitfelder ist dem Compiler überlassen. Beim sbit
> übernimmst du das. ;-)

Das interessiert doch bei reinen Software-Flags Überhaupt nicht.
Wenn ich die bitaddressierbarene x51-Special-Function-Register 
definieren muß, dann ist das was anderes. Da ist die Bit-Position ins 
Silizium gebrannt.
Gast
Carl D. schrieb:
> Das interessiert doch bei reinen Software-Flags Überhaupt nicht.

Ist es das hier?

Lars schrieb:
> for ...
>   SDA  = transbit;        // To Start transfer From Highest bit
...
>   transdata = transdata<<1;      // One bit left shift

Ich denke, die Bit-Position ist hier nicht unwichtig.

Und generell, wenn der µC einen BIT-adressierbaren RAM-Bereich hat, ist 
das von entscheidender Bedeutung!
Wie wird auf ein C 'Bit-Feld' zugegriffen? Und wie macht der µC das wohl 
im Keilschen bdata? Warum hat der µC wohl ein 'bdata' Bereich? 
Geschwindigkeit ist keine Hexerei ...
Bit By Bit schrieb:
> Carl D. schrieb:
>> Das interessiert doch bei reinen Software-Flags Überhaupt nicht.
>
> Ist es das hier?
>
> Lars schrieb:
>> for ...
>>   SDA  = transbit;        // To Start transfer From Highest bit
> ...
>>   transdata = transdata<<1;      // One bit left shift
>
> Ich denke, die Bit-Position ist hier nicht unwichtig.
>
> Und generell, wenn der µC einen BIT-adressierbaren RAM-Bereich hat, ist
> das von entscheidender Bedeutung!
> Wie wird auf ein C 'Bit-Feld' zugegriffen? Und wie macht der µC das wohl
> im Keilschen bdata? Warum hat der µC wohl ein 'bdata' Bereich?
> Geschwindigkeit ist keine Hexerei ...

Also braucht man gar keine Bitvariable sondern einfach nur:
1
SDA = (transdata&0x80)?1:0;
Da der GCC übersetzen soll: welcher der von ihm unterstützten μC hat 
"bdata"?
Gast
Oder SDA = (trans... & 0x80) != 0; oder, oder, ...
Viele Wege führen nach Rom.

Na siehste, geht doch.
Zum uC ließ die Beiträge oder benutze Google.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.