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

Gast #5043416
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
}
Gast #5043583
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.
#5043958
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.
Gast #5044103
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.
Persönliche Seite #5044117
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.
#5044128
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


;-)
#5044215
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
  }
Gast #5044235
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. ;-)
#5044245
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.
Gast #5044705
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 ...
#5044791
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"?

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