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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.