Bit-Zugriffe wie bei Microchip

OP #4452905
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
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.
Persönliche Seite
mmhmm ... ich frag mich ob der Compiler da soviel Möglichkeiten hat ...

Der union würde vmtl garnicht kompilieren, wenn es so wäre, wie in der 
vorherigen Antwort ... Also dass jedes Bit ein Byte belegt, aber nur 1 
Bit verwendet wird:
1
union un_p0 {
2
  unsigned char p0;
3
  __BITS8 BIT;
4
};
Gast
Thorsten S. schrieb:
> - was größeres

Schon mal geschaut, wie groß die Headerfiles von den PICs sind? Das 
selbst von Hand fehlerfrei hinzubekommen, ist möglicherweise mehr 
Aufwand, als das Projekt mit einem PIC neu zu starten.

MfG Klaus

P.S. ich vermute, die PIC-Leute lassen sich die Files automatisch aus 
den Prozessordesigns erzeugen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.