Bit-Zugriffe wie bei Microchip

OP #4452905
Lesenswert?
• ▲
▼
Hallo,

ich habe mich bei einem PIC-Projekt in deren Bit-Zugriff "verliebt" und 
hätte den natürlich gerne auf andere Projekte übertragen. Wenn ich mich 
nicht irre gehen die Xmegas z.B. auch in die Richtung, aber jetzt 
überlege ich, ob ich ein bestehendes Projekt nicht von "grausam" nach 
schön umziehen soll. Die PIC-Strukturen sehen so aus:
1
extern volatile unsigned int  IFS1 __attribute__((__sfr__));
2
typedef struct tagIFS1BITS {
3
  unsigned SI2C1IF:1;
4
  unsigned MI2C1IF:1;
5
  unsigned CMIF:1;
6
  unsigned CNIF:1;
7
  unsigned INT1IF:1;
8
  unsigned :4;
9
  unsigned OC3IF:1;
10
  unsigned OC4IF:1;
11
  unsigned T4IF:1;
12
  unsigned T5IF:1;
13
  unsigned INT2IF:1;
14
  unsigned U2RXIF:1;
15
  unsigned U2TXIF:1;
16
} IFS1BITS;
17
extern volatile IFS1BITS IFS1bits __attribute__((__sfr__));

In der Renesas iodefine.h steht:
1
typedef struct {
2
  unsigned char no0 :1;
3
  unsigned char no1 :1;
4
  unsigned char no2 :1;
5
  unsigned char no3 :1;
6
  unsigned char no4 :1;
7
  unsigned char no5 :1;
8
  unsigned char no6 :1;
9
  unsigned char no7 :1;
10
} __BITS8;
11

12
union un_p0 {
13
  unsigned char p0;
14
  __BITS8 BIT;
15
};
16

17
#define P0 (*(volatile union un_p0 *)0xFFF00).p0
18
#define P0_bit (*(volatile union un_p0 *)0xFFF00).BIT

Jetzt würde ich gerne wissen, ob so eine Umstellung

- ein Kinderspiel
- was größeres

ist, oder überhaupt nicht geht, weil man dabei ein Fass nach dem anderen 
aufmacht und man letztlich nach ein paar Versuchen eh nur frustriert das 
Handtuch wirft.

Danke,
Thorsten
Gast #4452916
Lesenswert?
• ▲
▼
Das mit den structs sind "bitfields", d.h. Du kannst ganz genau sagen, 
wie viele Bits eine Variable ist. Allerdings sagt der Standard IMHO 
nichts darüber aus, ob und wie padding gemacht wird, d.h. so ein struct 
könnte auch für jedes Element ein Byte verbrauchen (aber nur ein Bit 
daraus nutzen) anstatt nur einem. Bei den meisten Compilern kann man das 
mit entsprechenden Attributen steuern (sprich, die Lösung wird auf jeden 
Fall Compiler-abhängig!). Dann ist die Frage, wie effektiv der Zugriff 
auf die einzelnen Bits ist. Kommt also auch auf den Compiler an. Ich 
meine hier im Forum gab es auch schon öfters entsprechende Diskussionen.

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.