Forum: Compiler & IDEs Wie lauten diese Codezeilen (Keil-Compiler) für GCC?


von Lars (Gast)


Lesenswert?

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
}

von DraconiX (Gast)


Lesenswert?

Bitte sehr:

http://bfy.tw/COSl

von Bit By Bit (Gast)


Lesenswert?

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.

von Schmierlappen (Gast)


Lesenswert?

DraconiX schrieb:
> Bitte sehr:
>
> http://bfy.tw/COSl

Was für ein Schmierlappen bist Du doch!

von Nop (Gast)


Lesenswert?

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.

von Rene K. (xdraconix)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

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.

von Carl D. (jcw2)


Lesenswert?

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


;-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Lars schrieb:
> uchar bdata transdata;

Da fehlt ein Komma. Richtig wäre hier:
1
uchar bdata, transdata;

bleibt noch die Zeile für den Typ sbit. Dazu gab es ja schon 
hinreichende Hinweise.

von Carl D. (jcw2)


Lesenswert?

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
  }

von Bit By Bit (Gast)


Lesenswert?

Frank M. schrieb:
> Da fehlt ein Komma.

Nö,

Bit By Bit schrieb:
> uchar bdata => 8-Bit Variable, die im Bit-adressierbaren Bereich, z.
> B. beim c167, plaziert wird.

von Bit By Bit (Gast)


Lesenswert?

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. ;-)

von Carl D. (jcw2)


Lesenswert?

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.

von Bit By Bit (Gast)


Lesenswert?

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 ...

von Carl D. (jcw2)


Lesenswert?

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"?

von Bit By Bit (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.